在c ++中使用dll中的函数?

时间:2011-07-22 06:17:43

标签: c++ windows dll name-decoration

我在类名之前使用__declspec(dllexport)在c ++中创建了一个dll。现在,当我尝试在另一个c ++程序中使用它时,它会在两者之间崩溃。当我调试它时,我发现函数指针根本没有初始化。帮帮我。

using namespace std;

typedef void (*func)();

int main()

{

    func funcpointer;
    HINSTANCE xyz = LoadLibrary(TEXT("C:\\extra\\dll\\dlls\\debug\\random.dll"));
    funcpointer = (func)GetProcAddress(xyz,"get it");
    funcpointer();
    return 0;
}

提前致谢。

3 个答案:

答案 0 :(得分:2)

首先使用DUMPBIN /EXPORTS yourdll.dll查看您希望导出的功能是否实际导出及其完全名称。如果你找到了名字" mangled"您可能需要将函数声明为extern "C"。一旦确定了名称,你的方式就是正确的。加载库后,检查HINSTANCE xyz是否为空。如果为null,则您可能无法访问dll(不在搜索路径中)或由于某种原因无法加载,例如因为某些依赖项缺失。

答案 1 :(得分:1)

  1. 您应该编写要检索的函数的名称,而不是“获取它”。
  2. 您不仅应该拥有dllexport,还应该检索函数头文件中的整个dllexport / dllimport定义:

    #if defined DLL_EXPORT   
    #define DECLDIR __declspec(dllexport)
    #else
    #define DECLDIR __declspec(dllimport)
    #endif
    
    extern "C"
    {
       DECLDIR void foo();
    }
    
  3. 您可以阅读DLL Tutorial了解详情。

答案 2 :(得分:1)

导出函数时,请使用extern“C”fndecl。这将有助于获取未修饰的名称或使用def文件。要检查导出函数的名称,请使用工具Dependency Walker(depends.exe)。

如果您有C ++类,我建议您链接到DLL。使用GetProcAddress,使用C ++类会很痛苦。

如果您不熟悉DLL,此链接也可能对您有意义: Walkthrough: Creating and Using a Dynamic Link Library