如何使用Visual Studio中显式加载的C ++类dll

时间:2013-11-29 23:10:01

标签: c++ visual-studio dll

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

  

“应用程序不知道它必须具有的DLL的名称   加载到运行时“

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

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

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

修改

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

我甚至可以(但这对于这个应用程序非常具体)创建一个包含在dll中的类的对象(我们有一些钩子)。但是,我不能使用我的dll类的标题,因为那时它需要我加载“myDll.dll”

1 个答案:

答案 0 :(得分:0)

使用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

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