laden einer DLL Funktion funktioniert nicht.



  • typedef int (*getaddr)(	   const TCHAR*,
    						   const TCHAR* servname,
    						   const struct addrinfo* hints,
    						   struct addrinfo** res
    						);
    typedef char* (*gaistr)(	 int ecode	);
    typedef void (*freeaddri) ( struct addrinfo* ai);
    
    getaddr getaddrinfo; 
    gaistr gai_strerror;
    freeaddri freeaddrinfo;
    
    void loadMyDll()
    {
    	HINSTANCE hinstLib; 
        BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 
         // Get a handle to the DLL module.
         hinstLib = LoadLibrary(TEXT("Ws2_32")); 
         // If the handle is valid, try to get the function address.
         if (hinstLib != NULL) 
        { 
            /*getaddrinfo = (getaddr) GetProcAddress(hinstLib, TEXT("getaddrinfo")); 
             // If the function address is valid, call the function.
             if (NULL != getaddrinfo) 
            {
    			 printf("\nsuccesfull");
                fRunTimeLinkSuccess = TRUE;
            }
    		fRunTimeLinkSuccess=false;*/
    		gai_strerror = (gaistr) GetProcAddress(hinstLib, TEXT("gai_strerror")); 
             // If the function address is valid, call the function.
             if (NULL != gai_strerror) 
            {
    			 printf("\nsuccesfull");
                fRunTimeLinkSuccess = TRUE;
            }
    		/*fRunTimeLinkSuccess=false;
    		freeaddrinfo = (freeaddri) GetProcAddress(hinstLib, TEXT("freeaddrinfo")); 
             // If the function address is valid, call the function.
             if (NULL != freeaddrinfo) 
            {
    			 printf("\nsuccesfull");
                fRunTimeLinkSuccess = TRUE;
            }*/
            // Free the DLL module.
            // fFreeResult = FreeLibrary(hinstLib); 
        } 
         // If unable to call the DLL function, use an alternative.
         if (! fRunTimeLinkSuccess) 
            printf("Message via alternative method\n"); 
    }
    

    Bei der gai_strerror wird "Message via alternative method" ausgegeben. Was mache ich falsch?

    Hier die Def. in der MSDN:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/gai_strerror_2.asp



  • meiner meinung nach hast du falsch gecastet, probier mal das
    [cpp]
    gai_strerror = (gai_strerror) GetProcAddress(hinstLib, TEXT("gai_strerror"));
    [/cpp]



  • missing ';' before identifier 'GetProcAddress'

    Kommt dann leider als Meldung.



  • miller_m schrieb:

    meiner meinung nach hast du falsch gecastet, probier mal das
    [cpp]
    gai_strerror = (gai_strerror) GetProcAddress(hinstLib, TEXT("gai_strerror"));
    [/cpp]

    Nicht eher:

    gai_strerror = (gai_str) GetProcAddress(hinstLib, TEXT("gai_strerror"));
    

    ?



  • miller_m schrieb:

    meiner meinung nach hast du falsch gecastet, probier mal das
    [cpp]
    gai_strerror = (gai_strerror) GetProcAddress(hinstLib, TEXT("gai_strerror"));
    [/cpp]

    Das kanns eigentlich nicht sein, da gai_strerror ja kein Typ ist.
    Ich sehe momentan zwei Unstimmigkeiten.
    Erstens wird gai_strerror vermutlich gar nicht in der Bibliothek existieren, sondern einfach nur als Makro in bedingter Unicode Kompilierung definiert sein. Versuch mal die Adresse von gai_strerrorA bzw. gai_strerrorW zu bekommen. Wobei das vermutlich auch nichts bringen wird, da ich keine Library Angabe in der MSDN Doku sehe. Ist vermutlich als inline Funktion in einer Header Datei definiert.
    Und zweitens bringt TEXT bei GetProcAddress nichts, da ein LPCSTR übergeben wird.



  • war gestern nacht wohl nicht mehr ganz so fit 😃
    dar cast den ich vorgeschlagen habe ist natürlich blödsinn, wurde auch schon festgestellt (jetzt müsste ein "schäm" simley geben)



  • 🤡 <-- Da ist es 😃



  • Hallo zusammen,

    die Funktion "gai_strerr" wird nicht von "ws2_w32.dll" exportiert und kann somit auch nicht via LoadLibrary & GetProcAddress ermittelt werden. Um diese Funktion nutzen zu können, muss der Header "ws2tcpip.h" eingebunden werden, da dort die Funktion nicht nur definiert sondern auch implementiert ist.

    Gruß refowe



  • Ich hab diesen Header eingebunden, aber gai_strerror und getaddrinfo usw. sind undefiniert....WARUUUuuUUM? - *heul



  • refowe schrieb:

    da dort die Funktion nicht nur definiert sondern auch implementiert ist

    Und was ist da der Unterschied? 😃

    clierko schrieb:

    Ich hab diesen Header eingebunden, aber gai_strerror und getaddrinfo usw. sind undefiniert....WARUUUuuUUM? - *heul

    Evtl. altes PlatformSDK? Zudem steht in der Doku auch was von Wspiapi.h.



  • hab jetzt alles aus der sdk ins mfc++ verzeichnis kopiert.

    jetzt bekomme ich hunderte Fehler:

    Hier ein Ausschnitt:

    microsoft visual studio6\vc98\include\ws2tcpip.h(29) : error C2079: 'imr_multiaddr' uses undefined struct 'in_addr'
    e:\microsoft visual studio6\vc98\include\ws2tcpip.h(30) : error C2079: 'imr_interface' uses undefined struct 'in_addr'
    e:\microsoft visual studio6\vc98\include\ws2tcpip.h(38) : error C2079: 'imr_multiaddr' uses undefined struct 'in_addr'
    e:\microsoft visual studio6\vc98\include\ws2tcpip.h(39) : error C2079: 'imr_sourceaddr' uses undefined struct 'in_addr'
    e:\microsoft visual studio6\vc98\include\ws2tcpip.h(40) : error C2079: 'imr_interface' uses undefined struct 'in_addr'
    e:\microsoft visual studio6\vc98\include\ws2tcpip.h(46) : error C2079: 'imsf_multiaddr' uses undefined struct 'in_addr'
    e:\microsoft visual studio6\vc98\include\ws2tcpip.h(47) : error C2079: 'imsf_interface' uses undefined struct 'in_addr'
    e:\microsoft visual studio6\vc98\include\ws2tcpip.h(48) : error C2146: syntax error : missing ';' before identifier 'ims



  • clierko schrieb:

    hab jetzt alles aus der sdk ins mfc++ verzeichnis kopiert.

    Keine gute Idee. Sag deiner IDE einfach, wo sich die Include Verzeichnisse befinden (über die Optionen machbar).



  • Das hatte ich schon probiert..klappte nicht so recht, aber daran liegt es nicht.

    #include <winsock2.h>
    #include <WS2tcpip.h>
    
    int main()
    {
    	return 0;
    }
    

    Fehler:

    e:\microsoft visual studio6\vc98\include\wspiapi.h(45) : error C2265: '<Unknown>' : reference to a zero-sized array is illegal
    e:\microsoft visual studio6\vc98\include\wspiapi.h(45) : error C2265: '<Unknown>' : reference to a zero-sized array is illegal
    Error executing cl.exe.



  • zero-sized Arrays sind in C++ nicht erlaubt (IIRC auch in C). Und gerade im Hinblick auf Standard Konformität nutzen die PlatformSDK Header oft Compiler Erweiterungen. Hast du diese evtl. deaktiviert?



  • Wo kannich das an/abschalten? (MVC++ 6.0)



  • clierko schrieb:

    Wo kannich das an/abschalten? (MVC++ 6.0)

    I had same problem, now i have added:
    /D "_WSPIAPI_COUNTOF"
    to Project Options found in Project Settings...
    And now everything is ok...


Anmelden zum Antworten