0

當我用LoadLibrary加載iphlpapi.dll時,我的堆棧緩衝區溢出!我該如何解決 這個問題?帶LoadLibrary的STATUS_STACK_BUFFER_OVERRUN

typedef DWORD (*GetExtendedTcpTable)(PVOID, PDWORD, BOOL, ULONG, TCP_TABLE_CLASS, ULONG); 
GetExtendedTcpTable _GetExtendedTcpTable; 

// load function at runtime 
HINSTANCE hstLibrary = LoadLibrary("C:\\Windows\\System32\\Iphlpapi.dll"); 

if(!hstLibrary) 
{ 
    ::MessageBox(NULL,"Can't load Iphlpapi.dll!\n","Error", 
      MB_OK + MB_ICONEXCLAMATION + MB_TASKMODAL); 

    FreeLibrary(hstLibrary); // free memory 

    exit(0); 
} 

// load function address from dll 
_GetExtendedTcpTable = (GetExtendedTcpTable)GetProcAddress(hstLibrary, "GetExtendedTcpTable"); 

的lib功能的加載和執行工作正常,但在某些時候我的程序引發STATUS_STACK_BUFFER_OVERRUN例外!當我不使用LoadLibrary和GetProcAddress(靜態綁定) - >沒有緩衝區溢出的時候!(當然我在註釋字符串操作時會出現幾行後面的錯誤)

感謝和問候,

leon22

+0

庫頭文件中'GetExtendedTcpTable()'的確切定義是什麼? – sharptooth 2011-03-10 12:02:20

回答

3

你需要指定調用約定:

typedef DWORD (WINAPI * GetExtendedTcpTable)(PVOID, PDWORD, BOOL, ULONG, TCP_TABLE_CLASS, ULONG); 

默認調用約定在VS是__cdecl,Windows API的要求__stdcall。這些參數堆棧的處理方式不同,最顯着的是__cdecl要求調用者清理,而__stdcall需要清理被調用的函數。

WINAPI被定義爲__stdcall

參見例如Calling Conventions Demystified

+0

謝謝!它像一個魅力工作;-) – leon22 2011-03-10 12:27:30

0

我的第一個猜測是你對庫的函數使用了錯誤的調用約定,這會導致堆棧損壞(以及在調用完成之後纔出現的其他奇怪問題)。 檢查你是否不需要在函數原型中使用__stdcall或其他東西。