HINSTANCE? Gwht nicht?



  • hallo,

    ich habe mir grad das bcb tutorial angeschaut, dynamisches binden von dlls!

    da kommt diese zeile vor:

    HINSTANCE h = LoadLibrary(".....dll");
    

    allerdings findet er bei mir HINSTANCE nicht!

    muss ich da noch etwas einbinden?



  • Hallo

    grundsätzlich

    #include <windows.h>
    

    Das sollte in normalen VCL-Anwendungen aber schon vorhanden sein.
    Und wenn LoadLibrary erkannt wird, dann wird auch HINSTANCE erkannt.

    bis bald
    akari



  • ok, hab das nun, und funktioniert!

    habeaber dennoch paar fragen:

    int AddVals(int x, int y)
    {
     TAddVals* AddVals;
     int Erg;
     HINSTANCE h = LoadLibrary("Project1.dll"); 
     if(h!=0)
      AddVals = (TAddVals*)GetProcAddress(h,"_AddVals"); //Wieso "_AddVals"??Wo kommt der unterstrich her?
    //hat das was mit dem extern "C" __delspec(dllexport)AddVals(int x, int y) zu tun??
     if(AddVals != NULL)
      Erg = AddVals(x,y);
     else
      Erg = 0;
    
     FreeLibrary(h);
     return Erg;
    
    }
    

    meine frage steht im code als kommentar



  • Das hat etwas mit der Art zu tun, wie der Compiler die Funktionsnamen aufbreitet. Für den Linker müssen die Funktionsnamen eindeutig sein, deshalb erzeugt der Compiler sog. "dekorierte Namen" der Funktionen, in denen die Aufrufkonvention (und in C++ Funktionen auch die Parametertypen) reincodiert werden.



  • Hallo

    Ja, das kommt vom extern C. Und ist auch vom Borland-Compiler abhängig.

    bis bald
    akari



  • also kann ich pauschal davon ausgehen, das ich immer ein _ vor den Funktionsnamen der Funktion aus meiner DLL machen muss??



  • Pauschal würde ich sagen: nein

    (Laut MSDN* hängt es vom Aufrufschema ab, wie die Funktionsnamen erweitert werden. Also solltest du dir am besten die DLL ansehen, bevor du versuchst die falsche Funktion zu holen)

    * Ich weiß, daß ich hier nicht im MFC-Board bin, aber andere Compiler werden ähnliche Unterscheidungen machen.



  • CStoll schrieb:

    Also solltest du dir am besten die DLL ansehen, bevor du versuchst die falsche Funktion zu holen)

    ok, und woran erkenne ich, WIE der name dann aussehen muss?

    ich habe die dll ja selber geschrieben, und da war die funktion ohne den unterstrich!





  • In diesem Zusammenhang kann ich Dependency Walker dringend empfehlen.

    Btw, du kannst den vorangestellten Unterstrich beim BCB auch abschalten (im BDS 2006 unter Optionen|C++-Compiler|Ausgabe|Unterstriche für Symbolnamen erzeugen, ansonsten mit -u-). Auch wenn du die Aufrufkonvention __stdcall verwendest, wird standardmäßig keiner erzeugt.


Log in to reply