문제

기본적으로 다음과 같은 헤더 파일이 있습니다.

#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

그런 다음 다음과 같은 일을합니다.

    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;

그러나이 함수를 호출 할 때 ((*start) (test, & wsdata))를 호출하면이 오류 메시지가 표시됩니다.

소켓에서 0x7868146a에서 예외가없는 예외 : 0xc0000005 : 액세스 위반.

통화 규칙을 변경하려고 시도했지만 (__cdecl, Winapi, WSAAPI) 항상 동일한 오류 메시지로 끝납니다.

도움이 되었습니까?

해결책 2

해결되었다! 도와 주셔서 감사합니다. 이를 해결하기 위해 다음과 같이 typedef를 변경했습니다.

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

기본적으로 나는 Winsock2.h : p에서 복사하고 붙여 넣었다

다른 팁

Remus Rusanu에 대한 답변을 고려하여,이 작업을 원하는 이유는 다른 플랫폼 간에만 포트하는 것인 경우 가져 오기 레벨에서의 추상화는 원하는 것을 잘못 수행하는 잘못된 방법입니다. 예를 들어, 다른 플랫폼에서 유사한 보이는 소켓이 기능하는 오류 코드는 반환됩니다 (ID/번호뿐만 아니라 의미 및 가용성에 따라 다릅니다).

이전 에이 작업을 수행했으며 플랫폼 특정 소켓 기능 (또는 필요한 경우 여러 기능) 주위에 짧은 래퍼 기능을 갖추고 오류 메시지 등을 번역하여 내 응용 프로그램에 균일 한 WRT가되었습니다. 각 플랫폼에 대해 별도의 파일/구현이있었습니다. 잘 작동했습니다.

당신이 있고/또는 사용하지 않는 전처리 정의를 감안할 때, 값은 무엇입니까?WINAPI"당신이 그것을 컴파일 할 때? 나는 묻습니다 windef.h 같은 이상한 것들이 포함되어 있습니다.

#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

TypEdef 정의에서 사용하여 시도하십시오 __stdcall 대신에 WINAPI.


편집하다

컴퓨터에서 다음 코드를 실행하면 충돌하지 않으며 SocketStartup 호출은 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;
}

다음 컴파일러 명령 줄과 함께 Visual C ++ 2008을 사용하고 있습니다.

/Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TP /errorReport:prompt
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top