【问题标题】:MS Visual C\C++ Compiling DLL for use by Delphi?MS Visual C\C++ 编译 DLL 供 Delphi 使用?
【发布时间】:2015-08-30 10:00:28
【问题描述】:

我的经验是使用 Delphi XE2,我不熟悉 MS Visual C/C++。我正在尝试将一些 MS Visual C++ 代码编译成可以从 Delphi 使用的 DLL。

Delphi找不到编译好的DLL导出函数。

使用十六进制编辑器,DLL 导出表类似于以下 sn-ps,并且没有以 NULL 结尾的函数名称(NULL ASCII 字符位于 eol“Z”之后):

      ?MM_End@@YAH_N@Z
      ?MM_GetCurrentPosition@@YAHPAN0000@Z
      ?MM_GetWindow@@YAHPAN000@Z
      ?MM_MarkGetLinkFile@@YAHPAXPADH@Z
      ?MM_Start@@YAH_N@Z

C++ 头代码如下所示:

    ...
    #define MMAPI_API __declspec(dllexport)
    ...
    MMAPI_API int MM_Start(bool run_mmnav);
    MMAPI_API int MM_End(bool close_mmnav);
    ...

参考https://msdn.microsoft.com/en-AU/library/dt232c9t%28v=vs.90%29.aspx。我尝试了 __stdcall 和 _cdecl 的几种变体,但无法让 MS Visual C++ 编译带有 NULL 终止字符串的导出表。

【问题讨论】:

  • 这里有人说反对票应该附有解释。我不同意,但在这种情况下,反馈是值得的。下面的大卫提供了很多帮助,但你对他很粗鲁。在网络上发布您的技术问题时,值得穿上 Kevlar 夹克!批评会发生,只要是文明的,它仍然可以是建设性的。

标签: c++ delphi dll


【解决方案1】:

您正试图通过猜测对一种有据可查的格式进行逆向工程。 PE 格式是已知的并记录在案。你试图用十六进制编辑器来反转它是没有意义的。您根本不需要了解格式。使用现有工具列出导出的函数。例如 MS 工具链中的 dumpbin 或 Dependency Viewer。

列出导出后,您会发现它们已以 C++ 重命名的名称导出。名称修饰是 C++ 编译器如何在用于链接的函数名称中编码函数签名。 Mangling 旨在允许 C++ 工具链支持重载函数并继续使用 C 风格的链接器技术。

您将看到如下所示的导出符号列表:

  • ?MM_Start@@YAH_N@Z
  • ?MM_End@@YAH_N@Z

通过demangler 运行这些以确认它们是您所期望的。上述符号分解为:

int __cdecl MM_Start(BOOL)
int __cdecl MM_End(BOOL)

如果您愿意,可以使用这些名称导入它们。例如:

function MM_Start(run_mmnav: BOOL): Integer; cdecl;
  external dllname name '?MM_Start@@YAH_N@Z';

function MM_End(run_mmnav: BOOL): Integer; cdecl;
  external dllname name '?MM_End@@YAH_N@Z';

或者您可以选择在编译 DLL 时抑制导出函数的 C++ 名称修改。通过将函数声明包装在 extern "C" 块中,或使用 .def 文件导出函数来做到这一点。

【讨论】:

  • 感谢大卫直率的 cmets。您的回答做出了与文档相同的广泛假设,这没有帮助。通过调试,我在stackoverflow.com/questions/9576118/… 中回复了您的回答,以确定导出表中是否确实存在函数名称。通过查看 Delphi 可接受的本地 DLL,我正在编译的 DLL 显然不是相同的结构。我的问题是如何使用完全未知的 MS C/C++ 环境编译 DLL。不涉及逆向工程!
  • 你显然想错了。如果你能敞开心扉,我的回答会很有用。
  • 尊敬的大卫,你听起来像锅叫水壶黑色。你对问题的思考和认知是封闭的。
  • 我不这么认为。我已经清楚地解释了如何找到导出函数的名称,为什么它们会被破坏,以及如果你愿意的话如何将它们不破坏地导出。您是否仍然希望找到一种方法将空终止符放入 PE 元数据中?
  • 我从未尝试将空终止符放在任何文件中。我不会继续这个毫无结果的对话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
相关资源
最近更新 更多