![]() |
[C++] Dynamische Dll-Einbindung
Hi leute ich hab ich ein kleines problem und zwar versuche ich verzweifelt eine Dll-Datei in mein Projekt einzubinden - leider ohne erfolg!
Hier ist mein dll-code (komplett in c)
Code:
hier ist meine aufruffunktion!
#include <windows.h>
__declspec(dllexport) int add(int a, int b) { return a + b; }
Code:
ich habe keine ahnung warum das nicht funzt! vielleicht sieht einer von euch ja irgendwas!
void __fastcall TForm1::Button1Click(TObject *Sender)
{ typedef int (*add)(int, int); add func; int result; // DLL Datei laden HINSTANCE hinstLib = LoadLibrary("dllproj.dll"); if (hinstLib) { // Die Einsprungadresse abfragen func = (add)GetProcAddress(hinstLib, "add"); // Die Funktion aufrufen if (func) result = (*func)(2, 2); // Die DLL-Datei wieder entladen FreeLibrary(hinstLib); } if (!hinstLib || !func) { ShowMessage("E"); } else { ShowMessage(IntToStr(result)); } } |
Re: [C++] Dynamische Dll-Einbindung
Damit Funktionen überladen werden können, dekoriert ein C++-Compiler den Funktionsnamen mit einer codierten Parametertypliste, um ihn eindeutig zu machen. Wie du mit
![]() Um dem auszuweichen, kannst du die Funktion als extern "C" deklarieren:
Code:
Allerdings wird dann immer noch der aus C überlieferte Unterstrich vorne angehängt, so daß der exportierte Name "_add" lautet. Dies kannst du entweder über einen Compilerschalter oder über eine andere Aufrufkonvention verwenden. Leider ist auch das nicht standardisiert und wird von diversen Compilern unterschiedlich gehandhabt.
extern "C" __declspec (dllexport) int add (int a, int b)
{ return a + b; } Eine nette Übersicht über die Unterstrich-Konventionen verschiedener Compiler findest du ![]() Edit: Ein paar Kleinigkeiten zu deinem Code noch:
Code:
...
//func = (add)GetProcAddress(hinstLib, "add"); // besser mit reinterpret_cast <> func = reinterpret_cast <add> (GetProcAddress (hInstLib, "_add"); ... if (func) //result = (*func)(2, 2); // func muß nicht dereferenziert werden! result = func (2, 2); ... |
Re: [C++] Dynamische Dll-Einbindung
Hi DMW! vielen Dank für deine Antwort. Es lag also wirklich nur daran, dass der Compiler die funktion dekodiert hat. Hat mir wirklich weiter geholfen!
:-D :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 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