Probleme mit GetProcAdress



  • Hallo,

    ich hab ein Problem mit Funtionen aus einer DLL.

    Aus der DLL will ich 3 Funktionen benutzen, "StartRead", "StopRead" und "SaveSignature"

    Die ersten beiden Funktionen haben keine Parameter, die letzte hat 3 (BSTR, int, bool)

    Demzufolge habe ich mir zwei Typdefs gemacht sowie die jeweiligen Pointer:

    [cpp]typedef HRESULT (CALLBACK* FUNCTION_POINTER)(void);
    typedef HRESULT (CALLBACK* FUNCTION_POINTER_2)(BSTR, int, bool);
    FUNCTION_POINTER StartRead;
    FUNCTION_POINTER StopRead;
    FUNCTION_POINTER_2 SaveSignatureEx;
    [/cpp]
    

    Die DLL lade ich mit: (Diese wird auch erfolgreich geladen.)

    [cpp]HINSTANCE paddll = LoadLibrary("signpad.dll");[/cpp]
    

    Danach weise ich den Pointer die mit GetProcAddress zu:

    [cpp]
    StartRead          =(FUNCTION_POINTER)GetProcAddress(paddll, "StartRead");
    StopRead           =(FUNCTION_POINTER)GetProcAddress(paddll, "StopRead");
    SaveSignatureEx    =(FUNCTION_POINTER_2)GetProcAddress(paddll, "SaveSignatureEx");    
    [/cpp]
    

    Leider kriege ich keine gültige Adresse aus GetProcAddress zurück..

    habe ich irgendwo einen Denkfehler drin?

    mfg dave



  • Sind die Funktionen in der DLL auch richtig exportiert?



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Könnt an der verwendeten Namensdekoration liegen. Schau' dir 'mal die DLL mit

    dumpbin /EXPORTS die.dll
    

    an. Verwende zum Importieren der Funktionen die Namen genau so, wie sie dort angezeigt werden.

    Greetz, Swordfish



  • Da C++ ja Funktions-Überladung unterstützt, generiert der Compiler für jede Version einen eigenen (fast unleserlichen) Funktionsnamen.
    Wenn man die funktion als extern "C" erstellt, übernimmt der Compiler den richtigen Funktionsnamen.



  • qasdfgh schrieb:

    Wenn man die funktion als extern "C" erstellt, übernimmt der Compiler den richtigen Funktionsnamen.

    ...was ich nur empfehlen kann, denn:

    Swordfish schrieb:

    Verwende zum Importieren der Funktionen die Namen genau so, wie sie dort angezeigt werden.

    Da die C++-dekorierten Funktionsnamen compilerabhängig generiert werden, besteht dann aber die Gefahr, dass das Programm, dass die Dll dynamisch linkt, mit einer neue Version der Dll nicht mehr funktioniert.



  • 😡

    Cosmixx schrieb:

    qasdfgh schrieb:

    Wenn man die funktion als extern "C" erstellt, übernimmt der Compiler den richtigen Funktionsnamen.

    ...was ich nur empfehlen kann, denn:

    Swordfish schrieb:

    Verwende zum Importieren der Funktionen die Namen genau so, wie sie dort angezeigt werden.

    Da die C++-dekorierten Funktionsnamen compilerabhängig generiert werden, besteht dann aber die Gefahr, dass das Programm, dass die Dll dynamisch linkt, mit einer neue Version der Dll nicht mehr funktioniert.

    Du Vollidiot...:

    👎 OMG was für ein überflüssiger Post! 👎



  • @Spackken:
    Du solltest zunächst aufmerksam lesen, dann überlegen und dann schreiben, denn, das was ich geschrieben habe, kann durchaus passieren, wenn man die dekorierten Funktionsnamen mit GetProcAddress benutzt. Es war als Ergänzung zu Swordfish's Beitrag gedacht, aber Du hast Dir ja selbst schon einen passenden Nutzernamen gegeben. 👍


Anmelden zum Antworten