2015-12-11 30 views
0

在我的情況下,我通過GetProcAddress獲得了一個有效的導出函數名的函數指針,並且一旦我的應用程序調用導出的函數,就會在顯示輸出後崩潰。如果我從函數和typdef中刪除參數並直接傳遞19342「getNumChildShapes(19342)」,那麼一切都可以正常工作而不會崩潰。函數指針通過GetProcAddress提取崩潰應用程序

在我的應用程序:

typedef INT (CALLBACK* LPFNDLLFUNC2)(INT modelid); 
int codecall() 
{ 
    HINSTANCE hDLL; 
    LPFNDLLFUNC2 lpfnDllFunc2; 
    INT value = 0; 
    INT pass = 19342; 

    hDLL = LoadLibrary(L"myDLL"); 
    if (hDLL != NULL) 
    { 
     lpfnDllFunc2 = (LPFNDLLFUNC2)GetProcAddress(hDLL, "get_children"); 
     if (!lpfnDllFunc2) 
     { 
      // handle the error 
      FreeLibrary(hDLL); 
      return 0; 
     } 
     else 
     { 
      // call the function 
      value = lpfnDllFunc2(pass);   
     } 
    } 
    printf("Children: %i", value); 
    FreeLibrary(hDLL); 
    return 1; 
} 

在我的DLL:

extern "C" 
{ 
    __declspec(dllexport) int get_children(int modelid) 
    { 
     return getNumChildShapes(modelid); 
    } 
} 

回答

3
從DLL導出

你的功能將與C調用約定(__cdecl)進行編譯,但你的函數的typedef指針表示您希望將其視爲Windows調用約定(CALLBACK是__stdcall的宏)。混合這兩個不平衡的堆棧。

從函數指針聲明中刪除CALLBACK,或者用__stdcall聲明您的導出函數。

+0

謝謝,它工作。順便說一句,你能否給我提供一個鏈接,讓所有調用約定都有文檔記錄? – ceptonite

+0

此MSDN頁似乎覆蓋它:https://msdn.microsoft.com/en-us/library/zkwh89ks.aspx – DavidK

相關問題