AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi-Dll in C++-Anwendung laden

Ein Thema von seddto1977 · begonnen am 26. Aug 2005 · letzter Beitrag vom 27. Aug 2005
Antwort Antwort
Seite 1 von 2  1 2      
seddto1977

Registriert seit: 15. Apr 2004
69 Beiträge
 
#1

Delphi-Dll in C++-Anwendung laden

  Alt 26. Aug 2005, 21:57
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??
  Mit Zitat antworten Zitat
Benutzerbild von idontwantaname
idontwantaname

Registriert seit: 31. Aug 2004
Ort: Traiskirchen
575 Beiträge
 
Turbo Delphi für Win32
 
#2

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

  Alt 26. Aug 2005, 22:26
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 ??
Oliver Hanappi
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Freak
Delphi-Freak

Registriert seit: 26. Sep 2004
Ort: Wien Nähe (Österreich)
321 Beiträge
 
Delphi 2006 Architect
 
#3

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

  Alt 26. Aug 2005, 22:31
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'« )

LG
Gerhard Pfister
*
»To him who loves us and has freed us from our sins by his blood [...] be glory and power for ever and ever! Amen.« (Revelation*1,*5?6)
  Mit Zitat antworten Zitat
Benutzerbild von idontwantaname
idontwantaname

Registriert seit: 31. Aug 2004
Ort: Traiskirchen
575 Beiträge
 
Turbo Delphi für Win32
 
#4

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

  Alt 26. Aug 2005, 22:33
ahhh...bei dritten mal durchlesen hab ichs kapiert ^^
stimmt gerhard, sry mein fehler
Oliver Hanappi
  Mit Zitat antworten Zitat
seddto1977

Registriert seit: 15. Apr 2004
69 Beiträge
 
#5

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

  Alt 26. Aug 2005, 22:58
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
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#6

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

  Alt 26. Aug 2005, 23:19
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 ).
  Mit Zitat antworten Zitat
seddto1977

Registriert seit: 15. Apr 2004
69 Beiträge
 
#7

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

  Alt 27. Aug 2005, 09:08
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:
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?
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#8

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

  Alt 27. Aug 2005, 16:00
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 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 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 )
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

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

  Alt 27. Aug 2005, 16:28
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).
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#10

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

  Alt 27. Aug 2005, 17:05
Ich hatte etwas Zeit und habe ein kurzes Beispielprojekt erstellt. Siehe Anhang.
Angehängte Dateien
Dateityp: zip dllproc_153.zip (7,8 KB, 14x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 Uhr.
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