繁体   English   中英

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

[英]How to use a C++ class dll loaded explicitly in visual studio

正是出于此处提到的原因: http : //msdn.microsoft.com/zh-cn/library/vstudio/253b8k2c.aspx

“应用程序不知道运行时将要加载的DLL的名称”

我需要加载一个不将其名称绑定到应用程序的dll。 也就是说, 我不需要该应用程序要求“ myDll.dll”正常工作(因为在我们的配置系统中,myDll.dll的名称并非如此) 但是,对每个函数使用GetProcAddress似乎不是一个好主意,特别是因为它需要修饰的名称,并且容易出错。

我想知道是否有一种方法可以继续使用__declspec(dllimport)或类似的方法而无需dll名称绑定。

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

编辑:

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

我什至可以(但是这是非常特定于此应用程序的)创建dll中包含的类的对象(为此我们有一些钩子)。 但是,我无法使用dll类的标头,因为这要求我加载“ 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM