c++ - 如何使用在 visual studio 中显式加载的 C++ 类 dll

标签 c++ visual-studio dll

正是因为这里提到的原因: http://msdn.microsoft.com/en-us/library/vstudio/253b8k2c.aspx

"The application does not know the name of a DLL that it will have to load until run time"

我需要加载一个未将其名称绑定(bind)到应用程序的 dll。也就是说,我不需要应用程序要求“myDll.dll”才能工作(因为在我们的配置系统中,myDll.dll 不是那样命名的)。但是,对每个函数都使用 GetProcAddress 似乎不是一个好主意,特别是因为它需要修饰的名称,而且很容易出错。

我想知道是否有办法在没有 dll 名称绑定(bind)的情况下继续使用 __declspec(dllimport) 或类似的东西。

我最后的办法是创建一个 C 接口(interface)和一个使用 GetProcAddress 的类,但我认为应该有更好的方法。

编辑:

我应该注意,我可以编辑库的 .cpp 和 .h,创建 .lib 等。

我什至可以(但这对这个应用程序来说是非常具体的)创建一个包含在 dll 中的类的对象(我们有一些钩子(Hook))。但是,我不能使用我的 dll 类的 header ,因为它要求我加载“myDll.dll”

最佳答案

使用dumpbin程序列出导出的符号:

dumpbin /exports OLDNAME.dll

你会得到这样的输出:

Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file OLDNAME.dll

File Type: DLL

  Section contains the following exports for OLDNAME.dll

    00000000 characteristics
    529B7ABB time date stamp Sun Dec 01 19:06:51 2013
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint RVA      name

          1    0 00011109 ?MtDlladd@@YAHHH@Z = @ILT+260(?MtDlladd@@YAHHH@Z)

  Summary

        1000 .data
        1000 .idata
        2000 .rdata
        1000 .reloc
        1000 .rsrc
        4000 .text
       10000 .textbss

现在创建一个包含以下内容的新文本文件:

LIBRARY NEWNAME
EXPORTS
?MtDlladd@@YAHHH@Z

将 NEWNAME 替换为有问题的 DLL 的最终名称。 在 EXPORTS 下,按原样复制 implib 给出的所有函数名称。 将该文本文件命名为 NEWNAME.DEF

使用 lib 使用该 DEF 文件创建一个新的 lib 文件:

lib /def:NEWNAME.DEF /OUT:NEWNAME.lib

现在您可以链接到该库,您的应用程序将需要 NEWNAME.DLL

关于c++ - 如何使用在 visual studio 中显式加载的 C++ 类 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20294545/

相关文章:

c++ - 使用构造函数重载初始化多个变量

c++ - #include <winsqlite/winsqlite3.h> 在一个项目中工作,而不在另一个项目中工作

php - 在 VS 2010 中启用 PHP 亮点?

c# - 我可以拆分 .net DLL 而不必重新编译引用原始 DLL 的其他 DLL 吗?

c++ - 检查加载的DLL是否是系统模块

C++ vector 排序字符串问题

c++ - SDL C++ 错误 c3861

c++ - 从基类覆盖虚方法

visual-studio - Microsoft Azure 帐户上的 Microsoft Visual Studio 凭据错误

c++ - 有没有办法在加载 dll 时调试发布版本?