Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi-Dll in C++-Anwendung laden (https://www.delphipraxis.net/52293-delphi-dll-c-anwendung-laden.html)

seddto1977 26. Aug 2005 20:57


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:
library Screener;


uses
  ShareMem,
  SysUtils,
  Classes,
  Jpeg,
  Windows,
  Graphics;

{$R *.res}


function Dllfunc: Integer; stdcall;
begin
result := 26;
end;

exports Dllfunc;

begin
end.
Jetzt habe ich die DLL compiliert und rufe sie so aus meinem C++-Programm auf:

Delphi-Quellcode:
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(...)
      {
      }
   }
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??

idontwantaname 26. Aug 2005 21:26

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:
string Dir = "C:\\Screener.dll";
Warum zwei Backslashes ??

Delphi-Freak 26. Aug 2005 21:31

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

idontwantaname 26. Aug 2005 21:33

Re: Delphi-Dll in C++-Anwendung laden
 
ahhh...bei dritten mal durchlesen hab ichs kapiert ^^
stimmt gerhard, sry mein fehler :P

seddto1977 26. Aug 2005 21:58

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 :(

NicoDE 26. Aug 2005 22:19

Re: Delphi-Dll in C++-Anwendung laden
 
Code:
[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();
edit: in C++ sollte es statt (PFNDLLFUNC)GetProcAddress(...) eigentlich reinterpret_cast< PFNDLLFUNC >( GetProcAddress(...) ) lauten
ps: man kann auch in C/C++ ordentlichen Code schreiben (dein Code oben sieht durch die Delphi-Tags aus wie Kraut und Rüben ;)).

seddto1977 27. Aug 2005 08:08

Re: Delphi-Dll in C++-Anwendung laden
 
Danke für die Antwort :) Also das casten auf den Funktionstyp macht MSVC++ selbstständig.
Zitat:

PFNDLLFUNC pfnDllfunc;
//...
pfnDllfunc = (PFNDLLFUNC)GetProcAddress( /*...*/ );
Und hier muss ich an pfnDllfunc einen Zeiger auf die Funktion übergeben also so:
Delphi-Quellcode:
pfnDLLfunc = (PFNDLLFUNC *) ::GetProcAddress( /*...*/ );
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?

NicoDE 27. Aug 2005 15:00

Re: Delphi-Dll in C++-Anwendung laden
 
Zitat:

Zitat von seddto1977
Danke für die Antwort :) Also das casten auf den Funktionstyp macht MSVC++ selbstständig.

Hm, ich habe es nicht mit MSVC getestet :)

Zitat:

Zitat von seddto1977
Und hier muss ich an pfnDllfunc einen Zeiger auf die Funktion übergeben also so:
Code:
pfnDLLfunc = (PFNDLLFUNC *) ::GetProcAddress( /*...*/ );

Halte ich für ein Gerücht (zumindest wenn Du mein typedef übernommen hast - was der Standardweg zur Deklaration von Funktionszeigern ist...).

Zitat:

Zitat von seddto1977
Kann es vielleicht sein, dass das Problem damit zusammenhängt, dass die DLL kein DLLMain hat

Der Delphi-Compiler/Linker kann gar keine DLLs ohne DllMain erzeugen. Die DllMain ist in der Laufzeitbibliothek von Delphi versteckt - diese ruft dann den Code zwischen 'begin (*...*) end.' auf.
(siehe http://www.delphipraxis.net/internal...=380750#380750 )

Flocke 27. Aug 2005 15:28

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).

NicoDE 27. Aug 2005 16:05

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 15:06 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz