我有從DLL導入的函數。我控制主機可執行文件和動態庫的源代碼。現在,在DLLMain中,我使用MessageBox來彈出正在導出的函數的地址,並使用斷點將其與GetProcAddress返回的函數指針進行比較,它們是相同的。訪問衝突調用導入的函數
但是,當我嘗試調用該函數時,出現訪問衝突。有問題的函數只返回NULL並且沒有邏輯,所以它不能被函數拋出。
如何調用一個已知的有效函數指針,使用正確的簽名和已驗證的安全邏輯產生訪問衝突?
編輯:通過另一個關於調試器在這種情況下死亡的另一個問題獲得的信息表明我的堆棧也被砸了?這比AV更有意義,但函數指針和函數完全兼容,地址是正確的。
extern "C" Render* __cdecl CreateRender(WindowsOS* ptr) {
return nullptr;
}
typedef Render*(__cdecl *RendererCreateFunction)(WindowsOS*);
我在DLLMain中使用了一小段簡單的代碼來限定它們實際上與編譯器兼容。
BOOL WINAPI DllMain(
__in HINSTANCE hinstDLL,
__in DWORD fdwReason,
__in LPVOID lpvReserved
) {
RendererCreateFunction func = &CreateRender;
}
如果它們不兼容(它們包括相同的頭),那麼編譯器應該拋出一個錯誤並拒絕生成DLL,但它接受這個就好了。
也許調用約定不一致? – Vlad 2011-06-01 15:14:36
這是默認調用約定。我在兩側明確指定了__cdecl,在同一個模式(調試|釋放)和一個多線程設置(mt | mtd | etc)下,同一個效果 – Puppy 2011-06-01 15:21:34
都是針對一個架構的一部分組合的? – Raiv 2011-06-01 15:26:07