我该如何打开用C++创建的DLL文件以查看类、方法和源代码?

3

我找到了一个用C++创建的.dll文件。我想打开这个文件并查看类内部的函数。

我该如何打开此文件并在我的C++项目中调用其中的函数?


2
这是不可能的。DLL只包含编译后的代码和资源。您需要原始源代码和/或其库和头文件。 - Richard Critten
1个回答

3
使用微软的命令行实用工具dumpbin,您可以显示DLL导入或导出的内容:
dumpbin /exports Test0221-5.dll 

这将显示暴露的函数。但分析内容取决于您。例如:
Dump of file Test0221-5.dll
File Type: DLL
  Section contains the following exports for Test0221-5.dll
    00000000 characteristics
    555E19D5 time date stamp Thu May 21 19:45:57 2015
        0.00 version
           1 ordinal base
           4 number of functions
           4 number of names

    ordinal hint RVA      name
          1    0 000113E3 ??0Btest@@QAE@XZ = @ILT+990(??0Btest@@QAE@XZ)
          2    1 000112CB ??1Btest@@QAE@XZ = @ILT+710(??1Btest@@QAE@XZ)
          3    2 00011028 ?MemberFunc@A@@UAEXXZ = @ILT+35(?MemberFunc@A@@UAEXXZ)
          4    3 00011244 createInstance = @ILT+575(_createInstance)
  Summary
        1000 .data
        1000 .idata
        3000 .rdata
        1000 .reloc
        1000 .rsrc
        C000 .text
       10000 .textbss

所以,上面你可以看到函数4。名称对应一个符号,所以它可能是一个名为createInstance()extern "C"函数。但是你无法进一步了解其参数或返回类型。
函数1到3更加表意。它看起来像一个函数名,但名称中有?@和其他奇怪字符。这些是C++名称的“mangled”。名称的混合取决于编译器。
MSVC有一个工具undname:
undname ??0Btest@@QAE@XZ
  Undecoration of :- "??0Btest@@QAE@XZ"
  is :- "public: __thiscall Btest::Btest(void)"

你可以逐个符号地进行解析,但有一个更方便的方法:http://demangler.com/。你可以将完整的C++符号列表(MSVC或GCC)复制并粘贴到浏览器中,来查找我们示例中的结果。
public: __thiscall Btest::Btest(void) = @ILT 990(public: __thiscall Btest::Btest(void)
public: __thiscall Btest::~Btest(void) = @ILT 710(public: __thiscall Btest::~Btest(void)
public: virtual void __thiscall A::MemberFunc(void) = @ILT 35(public: virtual void __thiscall A::MemberFunc(void) 

所以你可以得到函数的类,判断它是否是虚拟的或静态的,返回类型、调用约定和每个参数的类型。也许这对你有帮助,但正如你所见,这种方法相当粗糙,不能完全满足需求。例如,你无法看到类继承和未导出的成员。

Dependency Walker 工具在一个漂亮的 GUI 中完成了上述所有操作。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接