![]() |
Delphi-Dll in C++-Anwendung laden
Hallo,
Ich möchte eine Delphi-Dll in eine meiner C++-Anwendungen laden. Soweit so einfach. Hier ist der DLL Code, bis jetzt nur zum Testen mit einem Rückgabewert(26), später kommen noch die Funktionen dazu:
Delphi-Quellcode:
Jetzt habe ich die DLL compiliert und rufe sie so aus meinem C++-Programm auf:
library Screener;
uses ShareMem, SysUtils, Classes, Jpeg, Windows, Graphics; {$R *.res} function Dllfunc: Integer; stdcall; begin result := 26; end; exports Dllfunc; begin end.
Delphi-Quellcode:
Ich habs mal auskommentiert, damit alle wissen was gemeint ist. Bis FreeLibrary funktioniert alles supi. Die Funktion liefert den Rückgabewert 26. Wenn ich dann FreeLibrary aufrufe gibt es unendlich viele Exceptions nacheinander und das Programm stürzt ab. Weiss jemand was falsch ist??
typedef int (fnTestd)(); //DLL funktion definieren mit Rückgabewert Integer
HINSTANCE hi; string Dir = "C:\\Screener.dll"; //Pfad zur DLL, vorerst statisch hi = ::LoadLibrary(Dir.c_str()); // Liefert gültiges Handle fnTestd *pTest; //Zeiger auf DLL Funktion pTest = (fnTestd * ) ::GetProcAddress(hi,"Dllfunc"); //Liefert auch gültiges Handle if(pTest != NULL) //Gültiges Handle bekommen? { try { int P =(*pTest) (); //P nach Aufruf == 26 FreeLibrary(hi); //Nach Aufruf von FreeLibrary unendlich viele Exceptions, 100% Systemlast } catch(...) { } } |
Re: Delphi-Dll in C++-Anwendung laden
Ich kenne mich zwar weder in C++ noch in der DLL-Programmierung gut aus, aber bist du sicher das der Pfad so stimmt ??
Code:
Warum zwei Backslashes ??
string Dir = "C:\\Screener.dll";
|
Re: Delphi-Dll in C++-Anwendung laden
Naja, die 2 Backslashes sind ja unter C so (zumindest unter PHP, was eine ähnliche Syntax hat); unter Delphi aber gibts dieses "Maskieren" mit einem Backslash davor nicht - also nur ein Backslash. Aus dem Anführungszeichen (»'«) werden in Delphi, wenn es als Zeichen im String sein soll zwei (z.B. »'I don''t want a name'« :zwinker: )
LG |
Re: Delphi-Dll in C++-Anwendung laden
ahhh...bei dritten mal durchlesen hab ichs kapiert ^^
stimmt gerhard, sry mein fehler :P |
Re: Delphi-Dll in C++-Anwendung laden
:) Ja die zwei Backslashes sind unter C++ richtig. Ich bekomm ja beim Laden der DLL auch ein gültiges Handle und die Funktion der DLL wird korrekt ausgeführt. Erst wenn ich FreeLibrary aufrufe gibts massenweise Exceptions :(
|
Re: Delphi-Dll in C++-Anwendung laden
Code:
edit: in C++ sollte es statt (PFNDLLFUNC)GetProcAddress(...) eigentlich reinterpret_cast< PFNDLLFUNC >( GetProcAddress(...) ) lauten
[color=blue]typedef[/color] [color=blue]int[/color] ([color=blue]__stdcall[/color] * PFNDLLFUNC)( [color=blue]void[/color] );
[color=gray]//...[/color] PFNDLLFUNC pfnDllfunc; [color=gray]//...[/color] pfnDllfunc = (PFNDLLFUNC)GetProcAddress( [color=gray]/*...*/[/color] ); [color=gray]//...[/color] [color=blue]if[/color]( pfnDllfunc != NULL ) pfnDllfunc(); ps: man kann auch in C/C++ ordentlichen Code schreiben (dein Code oben sieht durch die Delphi-Tags aus wie Kraut und Rüben ;)). |
Re: Delphi-Dll in C++-Anwendung laden
Danke für die Antwort :) Also das casten auf den Funktionstyp macht MSVC++ selbstständig.
Zitat:
Delphi-Quellcode:
Alles andere führt bei mir zu einem Compiler-Fehler. Eigentlich müsste der C++-Code stimmen, denn ich hab ihn (nur DLLName und den Namen der Funktion ersetzt) schon ohne Probleme auf mehrere DLLs angewendet, die ich mit C++ geschrieben hab. Kann es vielleicht sein, dass das Problem damit zusammenhängt, dass die DLL kein DLLMain hat, was bei C++ ja Standart ist?
pfnDLLfunc = (PFNDLLFUNC *) ::GetProcAddress( /*...*/ );
|
Re: Delphi-Dll in C++-Anwendung laden
Zitat:
Zitat:
Zitat:
(siehe ![]() |
Re: Delphi-Dll in C++-Anwendung laden
Bist du sicher, dass du die Routine in C++ als __stdcall deklariert hast? Wenn nicht, dann klappt ggf. zwar der Aufruf der Funktion, die zerhaut dir dann aber deinen Stack (und das könnte die ganzen Exceptions auslösen).
|
Re: Delphi-Dll in C++-Anwendung laden
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hatte etwas Zeit und habe ein kurzes Beispielprojekt erstellt. Siehe Anhang.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 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-2025 by Thomas Breitkreuz