2013-06-04 87 views
1

我在嘗試使用此功能運行時檢查失敗#0運行的功能

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); 
調用時此錯誤時
+0

[奇怪的MSC 8.0錯誤:「ESP的值未正確保存在函數調用中...」](http://stackoverflow.com/questions/142644/weird-msc-8-0 -error最值的-ESP-是 - 不正確保存的,跨一個函數)。 [這個答案](http://stackoverflow.com/a/1332874/902497)討論了原因。 –

+0

您沒有包含'LPFN_GETLSPGUID'的定義。運行時正在告訴你'LPFN_GETLSPGUID'與'GetLspGuid'不匹配。 –

+0

@RaymondChen它被定義爲typedef void(* LPFN_GETLSPGUID)(GUID * lpGuid); –

回答

3

此運行時檢查可防止函數聲明與實際定義之間的不匹配。將代碼編譯爲靜態庫或DLL時可能發生的意外。常見的不匹配是調用約定或傳遞參數的數量或類型。

該鞋適合,你有一個名爲WSPAPI的宏聲明瞭調用約定。它通常擴展爲__cdecl或__stdcall,通常偏向__stdcall。所以這個宏在你的客戶端代碼中有錯誤的價值。如果您無法弄清楚如何正確設置此宏,請向圖書館作者尋求幫助。


編輯後:與您正在加載錯誤版本的DLL的其他故障模式。而且你的LPFN_GETLSPGUID函數指針聲明是錯誤的,缺少WSPAPI宏。我會把錢放在那個上面,尤其是因爲我看不見它。


意見後,相關信息被慢慢滴:

it is defined as typedef void (*LPFN_GETLSPGUID) (GUID *lpGuid);

哪項是錯誤的,應該是

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

如果沒有宏觀可用,不可能做,然後用__stdcall替換WSPAPI。

+0

它改變了typedef void(WSPAPI * LPFN_GETLSPGUID)(GUID * lpGuid);非常感謝 –