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:
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 ; interfaceIndex : Longword; regtype : Array of Byte;
domain : Array of Byte; callBack : TDNSServiceBrowseReply; context : Pointer ): Longint ; cdecl; external 'dns-sd.dll';
implementation
end. |
Der Aufruf 'könnte' wie folgt aussehen:
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
Narses: Link eingefügt.Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 04.08.2010 um 13:46