Dynamischer Zugriff auf eine dll
-
Okay, das geht dann schonmal aber dann meldet der Compiler bei
DPInitDll* pDPInit;
[C++ Fehler] TProfibus.h(15): E2303 Typname erwartet
-
Ich sag mal nur DPInitDLL != DPInitDll
-
Braunstein schrieb:
Ich sag mal nur DPInitDLL != DPInitDll
Allerdings...
-
Braunstein schrieb:
Ich sag mal nur DPInitDLL != DPInitDll
*hUUUUUUUUUUUUUUUUUps* Sorry...
aber jetzt gibts folgendes in der TProfibus.cpp:
//typedef int (CALLBACK *TDPResult)(char*, char*); DP_RESULT pDPInit; //Compiler_Fehler:Hier kommt Fehler in der Deklarationssyntax HINSTANCE hInstance;
-
Ist der Typ DP_RESULT zu diesem Zeitpunkt schon bekannt ? Abgesehen davon, wozu brauchst du diese Variable überhaupt. Deinen Pointer auf die Funktion musst du ja wohl so "DPInitDLL *pDPInit;" deklarieren.
-
Braunstein schrieb:
Deinen Pointer auf die Funktion musst du ja wohl so "DPInitDLL *pDPInit;" deklarieren.
ah, okay, ich sehe ich lerne in diesem Fallk eine ganze Menge dazu! Vielen Dank an dich oder an euch!!!!
hab' jetzt folgendes:DPInitDLL *pDPInit;
und der Compiler meint:
**
[C++ Fehler] TProfibus.cpp(25): E2141 Fehler in der Deklarationssyntax
**
-
roN schrieb:
hab' jetzt folgendes:
DPInitDLL *pDPInit;
und der Compiler meint:
**
[C++ Fehler] TProfibus.cpp(25): E2141 Fehler in der Deklarationssyntax
**Ist das in Deiner .cpp-Datei? Eigentlich ist das doch schon im Header
deklariert.Gruß,
Alexander
-
Alexander Kempf schrieb:
Ist das in Deiner .cpp-Datei? Eigentlich ist das doch schon im Header
deklariert.Ganz korrekt, wo hab' ich bloss meinen Kopf *such*
... Naja, Danke für den Hinweis.
Jetzt nächstes Problem: Ich hab in meiner cpp folgendes:pDPInit = (DP_RESULT)::GetProcAddress(hInstance, "DPInit");
der Compiler:[C++ Fehler] TProfibus.cpp(40): E2451 Undefiniertes Symbol 'DP_RESULT'
weil ich ja die include-Anweisung mit dem prof_dp.h-header rausgenommen habe...
-
Na du stehst wohl heute ein bischen neben dir.
Der Typ deiner Funktion ist doch nicht DP_RESULT sondern DPInitDLL*.
-
Braunstein schrieb:
Der Typ deiner Funktion ist doch nicht DP_RESULT sondern DPInitDLL*.
... wie ich ja bereits in einer meiner früheren Beiträge geschrieben hatte...
(mal abgesehen von Groß-/Kleinschreibung)
-
Braunstein schrieb:
Na du stehst wohl heute ein bischen neben dir.
Sieht ganz so aus, also jetzt:
pDPInit = (DPInitDll)::GetProcAddress(hInstance, "DPInit");
Compiler:
**
[C++ Fehler] TProfibus.cpp(40): E2031 Typumwandlung von 'int (__stdcall *)()' nach 'unsigned long(char *,char *)' nicht zulässig
**
-
roN schrieb:
Compiler:
**
[C++ Fehler] TProfibus.cpp(40): E2031 Typumwandlung von 'int (__stdcall *)()' nach 'unsigned long(char *,char *)' nicht zulässig
**Komisch, daß dieser doofe Compiler einfach nicht errät, daß Du nicht auf
DPInitDll sondern eigentlich auf DPInitDll* umwandeln willst
Bei der Gelegenheit kannst Du auch gleich noch mal prüfen, ob die Groß-/Klein-
schreibung in Ordnung ist. Das errät der doofe Compiler nämlich auch nicht...
-
Ich glaube den Hinweis auf das __stdcall sollte auch beachtet werden.
-
Alexander Kempf schrieb:
Komisch, daß dieser doofe Compiler einfach nicht errät, daß Du nicht auf
DPInitDll sonder eigentlich auf DPInitDll* umwandeln willstDas MUSS er auch nicht erraten, aber wie verrate ich ihmn das den genau? Danke!
-
Tja, ich würd mal sagen, indem du auf DPInitDll* castest.
-
roN schrieb:
Das MUSS er auch nicht erraten, aber wie verrate ich ihmn das den genau? Danke!
Was eine Typumwandlung (type cast) ist, weißt Du aber? Der Compiler hilft dir übrigens,
indem er Dir die Zeilennummer ausgibt, in der der Fehler steht.Gruß,
Alexander
-
Alexander Kempf schrieb:
Was eine Typumwandlung (type cast) ist, weißt Du aber? Der Compiler hilft dir übrigens,
indem er Dir die Zeilennummer ausgibt, in der der Fehler steht.ja, irgendwie so geht doch das:
pDPInit = typeid (DPInitDLL*)(DPInitDll)::GetProcAddress(hInstance, "DPInit");
-
roN schrieb:
ja, irgendwie so geht doch das:
pDPInit = typeid (DPInitDLL*)(DPInitDll)::GetProcAddress(hInstance, "DPInit");
...oder vielleicht:
pDPInit = (DPInitDLL*) ::GetProcAddress(hInstance, "DPInit");
-
ah, nein, hab's geschafft:
pDPInit = (DPInitDll*)::GetProcAddress(hInstance, "DPInit");
*dummbin*
Okay, weiter geht's:void __fastcall TProfibus::Init(int SlaveID_int, unsigned int uPort) { // einstellen des COM-Ports und der Busgeschwinigkeit LPSTR pIni="COM1,SA1,01,00,60,09,C0,12,33,00,7D,7E,01,03,00,10,08,94,00,90,01,20,03,00,04,2C,01,1E,00", pDll= "fdlrs"; DPInitDll dpr; int Test_var; // result configuration if (pDPInit) // testen ob die Var noch gültig ist { dpr=pDPInit(pDll, pIni); // Hier motzt der Compiler, "L-Wert erwartet" <----------- if (dpr==DP_NO_ERROR)// Initialisierung des Profiadapters ShowMessage("Juhuuuuuuuuuuuuuuuiiiiiiiiiiiiiii!!!!!!!!!!!!!"); Tools::SetAllComponents(Main_Frm, true, crArrow); Main_Frm->Memo1->Lines->Add(pDPInit(pDll,pIni)); } }
-
dpr anders deklarieren
unsigned long dpr; // ... if (dpr==0)// Initialisierung des Profiadapters // usw.
Probier's doch erstmal so...