【问题标题】:Using functions in a dll in c++?在 C++ 中的 dll 中使用函数?
【发布时间】:2011-07-22 06:17:43
【问题描述】:

我在类名之前使用 __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;
}

提前致谢。

【问题讨论】:

  • 你说你在一个类上使用了__declspec(dllexport),但正在尝试导入一个函数。如果你以这种方式导出一个类,你几乎只能使用__declspec(dllimport) 导入它,你不能使用GetProcAddress。如果您在函数上使用了__declspec(dllexport),则该名称可能已被修饰,您必须在对GetProcAddress 的调用中使用修饰名称(使用depends.exe 或其他东西来查看修饰名称是什么)。跨度>
  • 究竟什么是“得到它”?我不能是导出函数的名称。
  • @Ajay:为什么不呢?我没有看到禁止它的规则。不过,您必须使用 DEF 文件。
  • 可能是,但到目前为止我还没有看到!

标签: c++ windows dll name-decoration


【解决方案1】:

首先使用DUMPBIN /EXPORTS yourdll.dll 来查看您希望导出的函数是否实际导出以及它的确切名称。如果您发现名称“mangled”,您可能需要将该函数声明为extern "C"。一旦你确定了名字,你走的路就是正确的。还要检查 HINSTANCE xyz 在加载库后变得不为空。如果为 null,您可能无法访问 dll(不在搜索路径中),或者由于某些原因它无法加载,例如缺少某些依赖项。

【讨论】:

  • 嗨,费利斯。正如你建议我的那样,我使用了 DUMPBIN 并进入了代码。当我达到 HINSTANCE 初始化时,我在自动窗口中得到了这个 - xyz 0x10000000 {unused=9460301 } HINSTANCE__ * used 9460301 int
  • @Apoorva sahay 拥有 0x1000000 意味着没关系,因为这是 dll 的默认加载地址,并且意味着 dll 正确加载。 su 只需检查名称。
【解决方案2】:
  1. 您应该写下要检索的函数的名称,而不是“获取它”。
  2. 在检索到的函数的头文件中不仅应该有 dllexport,还应该有整个 dllexport/dllimport 定义:

    #if defined DLL_EXPORT   
    #define DECLDIR __declspec(dllexport)
    #else
    #define DECLDIR __declspec(dllimport)
    #endif
    
    extern "C"
    {
       DECLDIR void foo();
    }
    

您可以阅读DLL Tutorial了解更多详情。

【讨论】:

    【解决方案3】:

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

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

    如果您是 DLL 新手,此链接也可能对您很感兴趣: Walkthrough: Creating and Using a Dynamic Link Library

    【讨论】:

    • 这个工具depends.exe 是否已从VS2010 包中删除?看来我可以在VC6中找到它,但在VS2010中找不到。虽然dumpbin可以胜任,但不如depends.exe方便。
    • 嘿,感谢专家 cmets。但是你能给我推荐任何好的教程或电子书或艾米材料,可以帮助我获得关于 dll 和 c++ 的良好知识。
    • 我喜欢从参考资料中学习。如果您也这样做,那么以下链接可能会有所帮助:Dynamic-Link LibrariesLinking an Executable to a DLL
    • 我添加了一个演练链接。
    • Thanx Frast,但我想问一下 extern "C" 是否也适用于课堂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2016-11-28
    相关资源
    最近更新 更多