![]() |
Re: Probleme beim einbinden einer DLL
Zitat:
@Christian: Danke für den Hinweis. Ich hab jetzt grad mal beides probiert: Nichts übergeben (Parameter komplett gestrichen) und Parameter auf const und nil übergeben. Das einzige was sich verändert ist die Adresse wo die Zugriffsverletzung auftritt. Wenn ich ohne Parameter aufrufe: Zugriffsverletzung bei Adresse 1000105C in Modul 'api32.dll'. Schreiben von Adresse 0044B749 Wenn ich nil übergebe dann schlägt der Versuch beim schreiben auf die Adresse 00000000. Ich der Dokumentation der API wird hier auch kein Parameter angegeben. Deswegen würde ich auch darauf tippen das nichts übergeben wird. Nur wie man sieht führt das auch nicht zum Erfolg. |
Re: Probleme beim einbinden einer DLL
Moin Markus,
bist Du sicher, dass die Aufrufkonvention stdcall richtig ist? Es könnte, z.B., auch cdecl sein. |
Re: Probleme beim einbinden einer DLL
Zitat:
Ich hab mal mit cdecl aufgerufen. Bringt aber auch keine Änderung. Was mir aber noch aufgefallen ist in dem .NET Wrapper:
Delphi-Quellcode:
Hier ist der Parameter als OUT gekennzeichnet und vom Typ Cardinal.
[DllImport('api32.dll', EntryPoint='__apiInit', CharSet=CharSet.Ansi)]
strict private class extern function __api32Init([Out] var A_0: Cardinal): boolean; static; Edit: Um das vollständig zu halten hier noch der eigentliche Aufruf der importierten Funktion:
Delphi-Quellcode:
function API.apiInit: boolean;
begin Result := API.__api32Init(@(API.a)) end;
Delphi-Quellcode:
strict private class var a: Cardinal;
|
Re: Probleme beim einbinden einer DLL
Ich bin noch mal ein wenig auf die Suche gegangen nach dem Fehler.
Dabei bin ich auch diese Seite gestoßen: ![]() Dort heißt es: Zitat:
Eine Api.h und eine ApiDll.h, ich gehe nun mal davon aus das ich die ApiDLL.h beachten sollte da hier die Macros definiert sind. Dort ist apiInit so definiert:
Code:
:| Wie finde ich nun raus was ich zum aufruf der DLL verwenden muss?
APIBOOL FAR PASCAL __apiInit(unsigned int far *handle);
Tante edit meint: Oh es ist was passiert. Ich hab den Beitrag mal weiter gelesen und bin auf diese Passage gestoßen: Zitat:
Also hab ich nun folgendes probiert:
Delphi-Quellcode:
Aufruf:
function __apiInit(Out handle:Pointer): Boolean; stdcall; external 'api32.dll';
Delphi-Quellcode:
Interessant ist nun das nichts passiert.
__apiInit(Handle) //Handle ist von Typ Pointer aber nicht initialisiert bzw belegt
Also keine Fehlermeldung aber der Server den die Dll starten sollte startet auch nicht... Edit²: Ich sehe nun im CPU Fenster das die DLL geladen wird. Ich hab nun auch herrausgefunden was ich als Parameter übergeben muss: Zitat:
|
Re: Probleme beim einbinden einer DLL
*bump* :duck:
Keiner der mir helfen kann? |
Re: Probleme beim einbinden einer DLL
Wenn Handle vom Typ unsigned int ist, müsste es doch in Delphi als Cardinal definiert werden und nicht als Pointer, oder?
|
Re: Probleme beim einbinden einer DLL
Ich habe es auch schon mit dem Typ Cardinal versucht.
Seltsam ist das er in die DLL einsteigt und dort auch einiges läuft. Was aber nur über das CPU Fenster sehen kann da ich keinen Quellcode zu der DLL habe. Und ASM kann ich nicht. :( Eigentlich müsste es so sein das nach dem Aufruf von apiInit der Komunikations Server startet. Danach ist das ganze einsatzbereit und ich kann via apiJob Aufträge senden und die Ergebnisse via apiResult abrufen. Nur leider startet der Komunikations Server nicht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz