[英]Loading DLL fails on Windows
作為Xcode開發人員,我也必須在Windows上使用我編寫的代碼。 我認為我已經成功地掌握了所有跨平台問題,但是現在我在理解Windows上的DLL地獄時遇到了一個真正的問題。 我將代碼成功用於Xcode和Gcc(Ubuntu)。 在Windows上,我收到一條錯誤消息:
運行時檢查失敗#0-在整個函數調用中ESP的值未正確保存。 這通常是由於用一種調用約定聲明的函數和用另一種調用約定聲明的函數指針進行調用的結果。
我讀到了很多有關這種用法的信息,但是我有一些問題要理解。 通常在Windows上我有類似
#define MYLIB_API __declspec(dllimport)
我在低音庫(bass.h)的標頭中找不到該文件。 只有一行
#define BASSDEF(f) WINAPI f
現在,我嘗試在代碼中動態加載DLL函數。 您可以在底部的鏈接中看到動態加載標題。 要復制很多。 這種動態加載適用於.dylib和.so庫,不適用於.dll。我的目標是動態加載DLL,而不能通過其他lib靜態加載。
在我的代碼中,我使用了bass.h和bassdecode.h。 在我的代碼中,我稱之為示例:
bool returnVar = _BASS_SetConfig(BASS_CONFIG_DEV_DEFAULT,1);
在這里,我得到呼叫約定消息。
要成功在Windows上導入DLL函數,我必須在頭文件中做什么?
您可以在以下位置下載文件: 要下載的頭文件
好的,對於所有遇到相同問題的人,解決方案都是Hans Passant的答案。 我無法將此答案標記為解決方案,因此我想給他以聲譽。
我的原始typedef函數:
typedef BOOL (*BASS_SetConfig_Type)(DWORD option, DWORD value);
在DLL中搜尋
_BASS_SetConfig = (BASS_SetConfig_Type)DllFindSym(m_hMod, "BASS_SetConfig")
DLLFindSym定義為:
#define DllFindSym(handle,name) (GetProcAddress(handle,name))
現在將typedef更改為
typedef BOOL (__stdcall *BASS_SetConfig_Type)(DWORD option, DWORD value);
現在,一切在Windows中都像魅力一樣。 非常感謝Hans Passant的快速提示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.