2013-01-15 299 views
1

我想從控制檯編譯DLL,不使用任何IDE,並面臨着下一個錯誤。編譯與intel編譯DLL的錯誤

我寫了這個代碼:

test_dll.cpp

#include <windows.h> 
#define DLL_EI __declspec(dllexport) 

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved){ 
    return 1; 
} 
extern "C" int DLL_EI func (int a, int b){ 
    return a + b; 
} 

然後用命令icl /LD test_dll.cpp編譯。我試圖從另一個程序中調用這個func

prog.cpp

int main(){ 
    HMODULE hLib; 
    hLib = LoadLibrary("test_dll.dll"); 
    double (*pFunction)(int a, int b); 
    (FARPROC &)pFunction = GetProcAddress(hLib, "Function"); 
    printf("begin\n"); 
    Rss = pFunction(1, 2); 
} 

icl prog.cpp編譯。然後我運行它,並且它失敗,出現標準窗口「程序不能正常工作」。也許分段錯誤錯誤。

我在做什麼錯?

+4

快速瀏覽GetProcAddress的應該與你的函數名,不是「功能」被調用。但在每次調用後添加一些適當的錯誤檢測代碼,以便您可以看到它失敗的位置。 – PeterJ

+0

你想使用錯誤處理和調試器 –

回答

3

檢查都LoadLibrary()GetProcAddress()成功,在這種情況下,他們是絕對不會爲導出函數被調用func,作爲參數指定GetProcAddress()這意味着函數指針將是NULL當嘗試調用它不是"Function"製作。

函數指針的簽名也與導出的函數的簽名不匹配,導出的函數返回int,函數指針預計爲double

例如:

typedef int (*func_t)(int, int); 

HMODULE hLib = LoadLibrary("test_dll.dll"); 
if (hLib) 
{ 
    func_t pFunction = (func_t)GetProcAddress(hLib, "func"); 
    if (pFunction) 
    { 
     Rss = pFunction(1, 2); 
    } 
    else 
    { 
     // Check GetLastError() to determine 
     // reason for failure. 
    } 
    FreeLibrary(hLib); 
} 
else 
{ 
    // Check GetLastError() to determine 
    // reason for failure. 
} 
+0

哦,這種愚蠢的錯誤與func和返回類型。感謝名單! – Michael