Autor Beitrag
Stephan.Woebbeking
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: Mi 04.08.10 09:32 
Hallo,

ich versuche auf eine dll zuzugreifen, hab aber noch fehlende Erfahrung und damit klappt's noch nicht...

Ich habe eine C-Header Datei als Info, was die Library anbietet. Da habe ich mal 'n bisserl was konvertiert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
unit UnitBonjourBridge;

interface

type TDNSServiceBrowseReply = procedure(
  sdRef               : Array of Byte;
  flags               : Longword;
  interfaceIndex      : Longword;
  errorCode           : Longint;
  serviceName         : Array of Byte;
  regtype             : Array of Byte;
  replyDomain         : Array of Byte;
  context             : Pointer
);

function DNSServiceBrowse(
  sdRef               : Array of Byte;
  flags               : Longword {unsigned 32bit};
  interfaceIndex      : Longword;
  regtype             : Array of Byte;

  domain              : Array of Byte;
  callBack            : TDNSServiceBrowseReply;
  context             : Pointer
): Longint {signed 32bit}cdeclexternal 'dns-sd.dll';

implementation

end.


Der Aufruf 'könnte' wie folgt aussehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure DNSServiceBrowseReply( sdRef: array of Byte; flags,
  interfaceIndex: Longword; errorCode: Longint; serviceName, regtype,
  replyDomain: Array of Byte; context: Pointer);
begin
  FormEnterIP.Show;
end;

procedure TFormStart.BtnFindDeviceClick(Sender: TObject);
var
  ret: Longint;
  sdRef, serviceName, regtype, domain: Array of Byte;
  flags, interfaceIndex: Longword;
  func: TDNSServiceBrowseReply;
begin
  MnuEnterIPClick( NIL );
  SetLength( sdRef, 20 );
  SetLength( serviceName, 60 );
  SetLength( regtype, 20 );
  SetLength( domain, 60 );
  flags := 0;
  interfaceIndex := 0;
  func := @DNSServiceBrowseReply;
  ret := DNSServiceBrowse( sdRef, flags, interfaceIndex, regtype, domain, func, NIL );
  ret := ret + 1;
end;


Formal scheint das soweit ok zu sein, kompilieren tu er's nun. Jetzt kommt das witzige, wie gesagt, vom Compiler bekomme ich weder Fehler noch Warnungen mehr. Dann setze ich einen BreakPoint in die 'BtnFindDeviceClick' Methode. Der wird aber nie erreicht, stattdessen bekomme ich eine Zugriffsverletzung am 'begin' des Hauptprogramms, also direkt vor Application.Initialize.

Irgendwelche Ideen? Achja, 'cdecl' und 'stdcall' habe ich schon beides probiert, das macht keinen Unterschied...

Stephan

BTW: Das ist auch schon im Bereich Netzwerke bei Zugriff auf Bonjour thematisiert, dort bin ich aber nicht weitergekommen, deshalb habe ich nochmal ein Extrakt dieses speziellen Problems erstellt. Das andere ist eher das 'Gesamtproblem'.

Moderiert von user profile iconNarses: Link eingefügt.
Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 04.08.2010 um 13:46
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Mi 04.08.10 10:35 
Ich denke mal deine Parameter sind falsch. Ich kann mir kaum vorstellen, dass eine C-DLL mit einem (dynamischen) array of byte etwas anfangen kann.
Aber ohne das Headerfile und Kristallkugel (die ist beim Polieren) kann man da wenig sagen.

Beste Grüße
Stephan.Woebbeking Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: Mi 04.08.10 12:54 
Ok, zum Verständnis, kann das denn dazu führen, dass ich eine Zugriffsverletzung bekomme, bevor der Aufruf erfolgt (Breakpoint)? Da versteh ich nicht so recht was zwischen Kompilierung und Ausführung noch an Problemen auftreten kann... Deshalb habe ich die Code-Teile auch hier weggelassen, aber wenn das wirklich das Problem sein kann, dann muss ich die eh erst noch entwickeln.
uko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Mi 04.08.10 13:05 
Das hört sich eher danach an, als ob die DLL nicht geladen wreden kann. Bindest Du die DLL statisch (via external Aufrufen) oder dynamisch ein (LoadLibrary)?

Uli

edit: ah, hab das
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function DNSServiceBrowse(
  sdRef               : Array of Byte;
  flags               : Longword {unsigned 32bit};
  interfaceIndex      : Longword;
  regtype             : Array of Byte;
  domain              : Array of Byte;
  callBack            : TDNSServiceBrowseReply;
  context             : Pointer
): Longint {signed 32bit}cdeclexternal 'dns-sd.dll';

überlesen. Also statisch, dann dürfte beim Laden die DLL nicht gefunden werden. Kopier die mal in das Verzeichnis, wo auch die Exe liegt.
Stephan.Woebbeking Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: Mi 04.08.10 16:07 
Oha, super, danke, so einfach, voll ins Schwarze, die .dll war falsch benannt, wie gesagt, mir fehlt die Erfahrung um diese Fehlermeldungen einordnen zu können...