如何使用Visual Studio中明确加载一个C ++类的DLL(How to use a C++

2019-10-19 01:55发布

对于正是这里提到的原因: 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”

Answer 1:

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

你有问题的DLL的最终名称替换NEWNAME。 在出口,复制所有由IMPLIB给出的函数名,因为是。 名称文本文件NEWNAME.DEF

请与DEF文件的新LIB文件,使用lib

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

现在,您可以用LIB链接,你的应用程序将需要NEWNAME.DLL



文章来源: How to use a C++ class dll loaded explicitly in visual studio