Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi C++ DLL in Delhi nutzen, GetProcAddress gibt immer nil zurück (https://www.delphipraxis.net/186772-c-dll-delhi-nutzen-getprocaddress-gibt-immer-nil-zurueck.html)

MarioR 28. Sep 2015 13:18

C++ DLL in Delhi nutzen, GetProcAddress gibt immer nil zurück
 
Hallo,

ich habe eine C++ DLL diese enthält (zur Zeit) eine Funktion
Code:
 __declspec(dllexport) int getVersion()
{   
   System::Console::Beep(500, 1000);
   return 2;       
}
Im Delphi versuche ich die "getVersion" aufzurufen:
Code:
...
    dllGetVersionName = 'getVersion@YAHXZ';
...
begin
    hRosiLib := LoadLibrary(libNamePath);
    if (hRosiLib<>0) then
    begin
      @vFuncVersion := GetProcAddress(hRosiLib, dllGetVersionName);
      if (Assigned(vFuncVersion)) then
      begin
        test := vFuncVersion();
        Result := '';
      end
      else
        Result := 'Fehler beim finden der Funktion['+dllGetVersionName+']';
      FreeLibrary(hRosiLib);
    end
    else
      Result := 'Fehler beim Laden der dll['+libNamePath+']!';
end;
Loadlibrary funktioniert, aber GetProcAddress liefert immer Nil.
"_cdecl und _stdcall" habe ich schon in allen Kombinationen ausprobiert.


DependencyWalker zeigt die Funktion als "int getVersion(void)" an
DLLEports2.0 als "?getVersion@@YAHXZ" bei _stdcall und "?getVersion@@YGHXZ" bei _cdecl.

...mmm... und nun ??
steht er da und hat keinen Schimmer wo es hackt.

Gruß Mario

DeddyH 28. Sep 2015 13:21

AW: C++ DLL in Delhi nutzen, GetProcAddress gibt immer nil zurück
 
Müsste es nicht einfach nur
Delphi-Quellcode:
dllGetVersionName = 'getVersion';
heißen?

BUG 28. Sep 2015 13:58

AW: C++ DLL in Delhi nutzen, GetProcAddress gibt immer nil zurück
 
Zitat:

Zitat von MarioR (Beitrag 1317114)
DependencyWalker zeigt die Funktion als "int getVersion(void)" an
DLLEports2.0 als "?getVersion@@YAHXZ" bei _stdcall und "?getVersion@@YGHXZ" bei _cdecl.

C++-Compiler machen Name-Mangling um z.B. überladenen Funktionen zu implementieren. Um die Funktion in anderen Sprachen nutzen zu können, ist es am einfachsten sie mit C-linkage zu deklarieren.
Code:
extern "C" __declspec(dllexport) int getVersion()
{   
   System::Console::Beep(500, 1000);
   return 2;      
}
Mehr findest du hier.

uligerhardt 28. Sep 2015 13:59

AW: C++ DLL in Delhi nutzen, GetProcAddress gibt immer nil zurück
 
Zitat:

Zitat von MarioR (Beitrag 1317114)
ich habe eine C++ DLL diese enthält (zur Zeit) eine Funktion
Code:
 __declspec(dllexport) int getVersion()
{   
   System::Console::Beep(500, 1000);
   return 2;       
}

Mach doch ein extern "C" drumrum, dann hast du kein Name mangling.

BTW: System::Console::Beep schaut nach .NET aus. Ich könnte mir vorstellen, dass das später auch Probleme macht.

Neutral General 28. Sep 2015 15:14

AW: C++ DLL in Delhi nutzen, GetProcAddress gibt immer nil zurück
 
Zitat:

Zitat von uligerhardt (Beitrag 1317118)
BTW: System::Console::Beep schaut nach .NET aus. Ich könnte mir vorstellen, dass das später auch Probleme macht.

Das ist kein .NET ;)

uligerhardt 28. Sep 2015 15:50

AW: C++ DLL in Delhi nutzen, GetProcAddress gibt immer nil zurück
 
Zitat:

Zitat von Neutral General (Beitrag 1317124)
Zitat:

Zitat von uligerhardt (Beitrag 1317118)
BTW: System::Console::Beep schaut nach .NET aus. Ich könnte mir vorstellen, dass das später auch Probleme macht.

Das ist kein .NET ;)

Ich dachte, das wäre das hier in C++/CLI-Notation.

Neutral General 28. Sep 2015 15:58

AW: C++ DLL in Delhi nutzen, GetProcAddress gibt immer nil zurück
 
Zitat:

Zitat von uligerhardt (Beitrag 1317131)
Zitat:

Zitat von Neutral General (Beitrag 1317124)
Zitat:

Zitat von uligerhardt (Beitrag 1317118)
BTW: System::Console::Beep schaut nach .NET aus. Ich könnte mir vorstellen, dass das später auch Probleme macht.

Das ist kein .NET ;)

Ich dachte, das wäre das hier in C++/CLI-Notation.

Mh jetzt bin ich mir dann doch nicht mehr ganz so sicher wie eben :mrgreen:
Ich nehms zurück und überlasse die korrekte Antwort jemandem der sich wirklich auskennt :stupid:

uligerhardt 28. Sep 2015 16:07

AW: C++ DLL in Delhi nutzen, GetProcAddress gibt immer nil zurück
 
Zitat:

Zitat von Neutral General (Beitrag 1317134)
Zitat:

Zitat von uligerhardt (Beitrag 1317131)
Zitat:

Zitat von Neutral General (Beitrag 1317124)
Zitat:

Zitat von uligerhardt (Beitrag 1317118)
BTW: System::Console::Beep schaut nach .NET aus. Ich könnte mir vorstellen, dass das später auch Probleme macht.

Das ist kein .NET ;)

Ich dachte, das wäre das hier in C++/CLI-Notation.

Mh jetzt bin ich mir dann doch nicht mehr ganz so sicher wie eben :mrgreen:
Ich nehms zurück und überlasse die korrekte Antwort jemandem der sich wirklich auskennt :stupid:

Ist eigentlich auch egal und hat nichts mit dem akuten Problem zu tun. Aber ich würde sicherheitshalber einfach MessageBeep oder so aufrufen. :mrgreen:

MarioR 28. Sep 2015 19:34

AW: C++ DLL in Delhi nutzen, GetProcAddress gibt immer nil zurück
 
Hallo Ihr alle,

... man seit Ihr schnell.
Hab leider 8-) 14:15 Feierabend und war heute Nachmittag unterwegs.

Zitat:

extern "C"
wird Morgen probiert.

Zitat:

Müsste es nicht einfach nur
dllGetVersionName = 'getVersion'; heißen?
Ja natürlich, das "olle" dllGetVersionName = 'getVersion@YAHXZ';
ist nur von meinen "verzweifelten" Versuchen übrig geblieben.

Zitat:

System::Console::Beep(500, 1000);
Ein Sound "HELLO" hab ich auf der schnelle nicht hin bekommen und wollte,
besser will nur mal hören, ob sie anläuft. :zwinker:

Die DLL soll eine Wrapperklasse für meine .NET-Entwicklungen damit mein
Kollege sie unter Delphi nutzen kann.


Gruß und vorerst Dankeschön
Mario


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 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