Frage

Im Grunde habe ich eine Header-Datei wie folgt aus:

#if WIN32
typedef DWORD (WSAAPI *SocketStartup) (WORD wVersionRequested, LPWSADATA lpWSAData);
typedef SOCKET (WINAPI *MakeSocket)(IN int af,    IN int type,    IN int protocol,    IN LPWSAPROTOCOL_INFOW lpProtocolInfo,    IN GROUP g,    IN DWORD dwFlags    );
typedef DWORD (WINAPI *SocketSendFunc) (IN SOCKET s,__in_bcount(len) const char FAR * buf, IN int len,IN int flags);
typedef DWORD (WINAPI *GetLastSocketErrorFunc)();
typedef DWORD (WINAPI *ShutdownSocketFunc)(SOCKET hSocket, int how);
typedef DWORD (WINAPI *CloseSocketFunc)(SOCKET hSocket);
#endif

und dann so etwas wie dies tue ich:

    SocketStartup* start = (SocketStartup*)GetProcAddress(socketLib,"WSAStartup");
    getLastSocketError = (GetLastSocketErrorFunc*)GetProcAddress(socketLib,"WSAGetLastError");
    closeSocket = (CloseSocketFunc*)GetProcAddress(socketLib,"closesocket");
    shutdownSocket = (ShutdownSocketFunc*) GetProcAddress(socketLib,"shutdown");
    socketSend = (SocketSendFunc*) GetProcAddress(socketLib, "send");
    if(start == 0 || getLastSocketError == 0 || closeSocket == 0 || shutdownSocket == 0
        || socketSend == 0)
    {
        printf("[!] Failed to find entry points in Ws2_32.dll. Error Code: %d\n", GetLastError());
        CloseLibraries();
        ErrorExit();
    }
    WSADATA wsdata;

    //ZeroMemory(&wsdata,sizeof(wsdata));
    printf("error: %d\n", GetLastError());
    WORD test = MAKEWORD(1,1);
    int result = (*start)(test, &wsdata);
    return result == 0;

Allerdings, wenn ich diese Funktion aufrufen (die Linie mit (* Start) (Test & wsdata)) Ich erhalte diese Fehlermeldung:

  

Nicht behandelte Ausnahme bei 0x7868146a in   SOCKETS.EXE: 0xC0000005: Zugriffs   Verletzung.

Ich habe versucht, die Aufrufkonvention zu ändern (__cdecl, WINAPI, WSAAPI), aber es endet immer mit der gleichen Fehlermeldung.

War es hilfreich?

Lösung 2

Gelöst! Vielen Dank für Ihre Hilfe. Um es zu beheben Ich habe gerade die typedef wie folgt:

typedef int (WSAAPI SocketStartup)(    IN WORD wVersionRequested,    OUT LPWSADATA lpWSAData    );

Im Grunde ich kopieren und einfügen von Winsock2.h: P

Andere Tipps

Unter Berücksichtigung Ihrer Antwort auf Remus Rusanu, wenn der Grund wollen, sind Sie dies nur zwischen verschiedenen Plattformen, abstrahiert beim Import Ebene ist der falsche Weg zu tun, was Sie wollen in den Hafen zu tun ist. die Fehlercodes zum Beispiel, dass die ähnlich aussehenden Socket-Funktionen auf verschiedene Plattformen zurückkehren werden, variieren (nicht nur in ihrer id / Zahl, aber in der Bedeutung und Verfügbarkeit).

Ich habe das schon mal gemacht, und ging mit rund um die plattformspezifische Socket-Funktionen Kurz Wrapper-Funktionen (oder mehrere Funktionen bei Bedarf), die Fehlermeldungen übersetzt etc, so dass sie einheitlich WRT auf meine Bewerbung waren; Ich hatte eine separate Datei / Implementierung für jede Plattform. Es hat gut funktioniert.

die Präprozessordefinition gegeben, die Sie sind und / oder nicht verwenden, was ist der Wert von „WINAPI“, wenn Sie es kompilieren? Ich frage, weil windef.h seltsame Dinge enthält wie ...

#ifdef _MAC
#define CALLBACK    PASCAL
#define WINAPI      CDECL
#define WINAPIV     CDECL
#define APIENTRY    WINAPI
#define APIPRIVATE  CDECL
#ifdef _68K_
#define PASCAL      __pascal
#else
#define PASCAL
#endif
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK    __stdcall
#define WINAPI      __stdcall
#define WINAPIV     __cdecl
#define APIENTRY    WINAPI
#define APIPRIVATE  __stdcall
#define PASCAL      __stdcall
#else
#define CALLBACK
#define WINAPI
#define WINAPIV
#define APIENTRY    WINAPI
#define APIPRIVATE
#define PASCAL      pascal
#endif

Ihre typedef Definitionen, versuchen Sie es mit der Verwendung von __stdcall statt WINAPI.


Bearbeiten

Wenn ich den folgenden Code auf meinem Rechner laufen, ist es nicht zum Absturz bringen und die socketStartup Aufruf zurückgegeben 0:

#include "windows.h"

typedef DWORD (PASCAL FAR *SocketStartup) (WORD wVersionRequested, LPWSADATA lpWSAData);

int main(int argc, char* argv[])
{
    HMODULE hModule = LoadLibrary("wsock32.dll");
    SocketStartup socketStartup = (SocketStartup)GetProcAddress(hModule, "WSAStartup");
    WSADATA wsdata;

    WORD test = MAKEWORD(1,1);
    int result = (*socketStartup)(test, &wsdata);
    return result == 0;
    return 0;
}

Das ist mit Visual C ++ 2008, mit der folgenden Compiler-Befehlszeile:

/Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TP /errorReport:prompt
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top