Dynamischer Zugriff auf eine dll



  • 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 willst 😉

    Das 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...



  • Und Ich weiß auch schon, wo der Compiler als nächstes meckern wird. 😉 😃



  • WebFritzi schrieb:

    Und Ich weiß auch schon, wo der Compiler als nächstes meckern wird. 😉 😃

    Und bestimmt nicht das letzte mal... 🙂



  • Aber er mekert weiter oben ja schon, bei
    dpr=pDPInit(pDll, pIni);
    da bringt nichts wenn ich das prüfen der Var verändere auf:

    if (dpr==0)// Initialisierung des Profiadapters
    

    roN schrieb:

    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));
     }
    
    }
    


  • Sieh dir doch bitte mal die Deklaration von dpr in Alexanders Post genau an.



  • Braunstein schrieb:

    Sieh dir doch bitte mal die Deklaration von dpr in Alexanders Post genau an.

    UUUUUUUUps, hm okay, hab' das behoben... und funktioniert jetzt, ausser das die Funktion 4 und nicht 0 zurückgibt ärger aber da könnt Ihr mir wahrscheinlich nicht helfen, aber vielleicht beim verstehen der Fehlermeldung:
    Was heisst FDL-Library und was bedeutet das? "DP_FDL_LOAD_FAILED, / unable to load FDL library */*"


Anmelden zum Antworten