1

尝试使用此功能时出现此错误

 void WSPAPI GetLspGuid( LPGUID lpGuid )
 {
    memcpy( lpGuid, &gProviderGuid, sizeof( GUID ) );
 }

错误

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

该函数是通过使用调用的

HMODULE         hMod = NULL;
LPFN_GETLSPGUID fnGetLspGuid = NULL;
int             retval = SOCKET_ERROR;

// Load teh library
hMod = LoadLibraryA( LspPath );
if ( NULL == hMod )
{
    fprintf( stderr, "RetrieveLspGuid: LoadLibraryA failed: %d\n", GetLastError() );
    goto cleanup;
}

// Get a pointer to the LSPs GetLspGuid function
fnGetLspGuid = (LPFN_GETLSPGUID) GetProcAddress( hMod, "GetLspGuid" );
if ( NULL == fnGetLspGuid )
{
    fprintf( stderr, "RetrieveLspGuid: GetProcAddress failed: %d\n", GetLastError() );
    goto cleanup;
}

// Retrieve the LSPs GUID
fnGetLspGuid( Guid );
4

1 回答 1

3

此运行时检查可防止函数声明与实际定义不匹配。将代码编译成静态库或 DLL 时可能发生的事故。常见的不匹配是调用约定或传递的参数的数量或类型。

鞋子合脚,你有一个名为 WSPAPI 的宏,它声明了调用约定。它通常扩展为 __cdecl 或 __stdcall,通常偏向 __stdcall。这个宏在您的客户端代码中具有错误值的可能性非常高。如果您不知道如何正确设置此宏,请向库作者寻求帮助。


编辑后:使用附加的故障模式,您正在加载错误版本的 DLL。并且您的 LPFN_GETLSPGUID 函数指针声明是错误的,缺少 WSPAPI 宏。我会把钱花在那个上,尤其是因为我看不到它。


评论后,信息正在慢慢渗入:

它被定义为 typedef void (*LPFN_GETLSPGUID) (GUID *lpGuid);

哪个是错的,应该是

typedef void (WSPAPI * LPFN_GETLSPGUID)(GUID *lpGuid);

如果您没有可用的宏,不太可能,那么用 __stdcall 替换 WSPAPI。

于 2013-06-04T00:52:04.313 回答