DLL einbinden
-
Hallo!
Ich bin noch Anfänger in Sachen DLL-Programmierung und hoffe hier passende Hilfe zu finden. Im Forum selbst habe ich schon ein paar Beiträge gefunden, die mir allerdings nicht viel weiterhelfen konnten, weil ich nicht mal soweit komme.
Ich suche ist einen kompletten und verständlichen Sourcecode, andem ich nachvollziehen kann wie das funktioniert. Ein weiteres Detail, was nicht unbeachtet bleiben soll, ist das ich eine Dll (nicht unter c++ erstellt, wahrscheinlich Delphi) einbinden möchte, die ich nicht selbst erstellt habe. Deswegen habe ich weder eine cpp noch lib Datei. Das man mit implib eine Lib Datei erzeugen kann weiß ich. Nur weiß ich nicht, wie ich diese in die Borland C++ 4 Umgebung einbinden kann. Aus der DLL heraus wird nur eine Funktion aufgerufen. Diese liefert einen Integerwert zurück.
Bei meinen bisherigen Versuchen bin ich an der Fehlermeldung "Unresolved external symbol referenced from module" gescheitert.
Was bedeutet diese Fehlermeldung?
Ich bedanke mich schonmal im Vorraus bei jedem, der mir bei meinem Problem helfen kann.
André
-
Folgender Code sollte dir zeigen wie die Sache auch ohne LIB-Datei funktioniert.
// In Header-Datei class TDLLTest { private: typedef int (DLLFUNCTION)(int, int); DLLFUNCTION *pDllFunction; public: TDLLTest(); void CallDllFunction(int iTest1, int iTest2); } // In CPP-Datei TDLLTest::TDLLTest() { HINSTANCE hInstance; hInstance = ::LoadLibrary("DelphiDLL.dll"); pDllFunction = (DLLFUNCTION*)::GetProcAddress((HMODULE)hInstance, "NameOfDllFunction"); } void TDLLTest::CallDllFunction(int iTest1, int iTest2) { int iResult; if (pDllFunction) iResult = (*pDllFunction)(iTest1, iTest2); }
[ 09.07.2001: Beitrag editiert von: Happy Builder ]
-
Vielen Dank Happy Builder!
Um Deinen Code compilieren zu können, muß ich noch wissen, welche include Anweisungen ich noch machen muß. Derzeit erhalte ich die Fehlermeldung Undefiniertes Symbol HINSTANCE. Mit der Borland Hilfe kann ich zu diesem Punkt nicht viel mit anfangen.
André
-
Ich glaube, da mußt du windows.h einbinden.
Wenn das nicht funktioniert, dann windef.h
also #include <windows.h> oder #include<windef.h>
------------------
Happy Building
wünscht
Happy Builder
Ein Besuch der sich lohnt: http://www.bcbarena.de
-
Der Schritt hat geklappt nachdem ich nach langem Suchen ein fehlendes Semikolon gefunden hatte.
Wenn ich jetzt aber in meiner Main Routine die Funktion aus der Dll aufrufen möchte (TDLLTest.CallDllFunction(variablen); ) kommt die Fehlermeldung E2108 Ungültige Verwendung von typedef ‘TDLLTest’. Was könnte ich jetzt falsch gemacht haben?Und nochmals Vielen Dank für Deine Mühe.
André
-
Über
TDLLTest.CallDllFunction(iTest1, iTest2);
kannst du die Funktion nicht aufrufen.
Das geht nur über
int iResult;
if (pDllFunction)
{
iResult = (*pDllFunction)(iTest1, iTest2);
}Poste doch mal den Code, den du aus meinem Code gemacht hast.
------------------
Happy Building
wünscht
Happy Builder
Ein Besuch der sich lohnt: http://www.bcbarena.de
-
meine CPP Datei
#include <condefs.h> #pragma hdrstop #include <stdio.h> #include <conio.h> #include "exe2.h" #include <windef.h> //--------------------------------------------------------------------------- TDLLTest::TDLLTest() { HINSTANCE hInstance; hInstance = ::LoadLibrary("wandel.dll"); pDllFunction = (DLLFUNCTION*)::GetProcAddress((HMODULE)hInstance, "Konvert (char*,char*,char*,char*)"); } void TDLLTest::CallDllFunction(char*,char*,char*,char*) { int iResult; if (pDllFunction) iResult = (*pDllFunction)("a01.tif","ausgabe","jpg","90"); printf(""+iResult); } #pragma argsused int main(int argc, char* argv[]) { TDLLTest.CallDllFunktion(); /*Hier wollte ich die Funktion aus der DLL aufrufen.*/ getch(); return 0; } // meine .h Datei class TDLLTest { private: typedef int (DLLFUNCTION)(char*,char*,char*,char*); DLLFUNCTION *pDllFunction; public: TDLLTest(); void CallDllFunction(char*,char*,char*,char*); };
Der Aufruf soll laut der Beschreibung
function Konvert(quelle char;ziel char;Typ char;Zusatz char):Integer; stdcall;
sein.Ich hoffe Du kannst mir bei meinem Problem helfen. Wahrscheinlich sehe ich schon die einfachsten Dinge nicht mehr. Sitze schon seit ein paar Tagen an diesem Problem.
Danke!
André
[ Dieser Beitrag wurde am 17.09.2002 um 21:24 Uhr von Jansen editiert. ]
-
Drei Fehler sind mir aufgefallen.
[cpp]TDLLTest::TDLLTest()
{
HINSTANCE hInstance;
hInstance = ::LoadLibrary("wandel.dll");
pDllFunction = (DLLFUNCTION*)::GetProcAddress((HMODULE)hInstance, "Konvert");
}void TDLLTest::CallDllFunction**()**
{
int iResult;
if (pDllFunction)
iResult = (*pDllFunction)("a01.tif","ausgabe","jpg","90");
printf(""+iResult);
}#pragma argsused
int main(int argc, char* argv[])
{
TDLLTest DllTest;DLLTest.CallDllFunktion();
getch();
return 0;
}//In der H-Datei
class TDLLTest
{
private:
typedef int (DLLFUNCTION)(char*,char*,char*,char*);
DLLFUNCTION pDllFunction;
public:
TDLLTest();
void CallDllFunction*()**;
};[/cpp][ Dieser Beitrag wurde am 17.09.2002 um 21:27 Uhr von Jansen editiert. ]
-
Ich habe mich erstmal registriert und möchte Dir ganz herzlich danken, daß Du mir bei diesem Problem geholfen hast. Es funktioniert alles so, wie ich es wollte und so langsam verstehe ich auch was in Deinem Quellcode passiert
Danke!
André