2013-01-15 308 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