【问题标题】:Using DLL with C++ class functions in Delphi在 Delphi 中将 DLL 与 C++ 类函数一起使用
【发布时间】:2013-03-12 20:45:33
【问题描述】:

问题:如何在 Delphi 中导入名为“IOperation7::SaveAsWavFile”的 DLL 函数?

详情/说明:

我正在尝试编写代码(在 Delphi XE 中,也必须在 D2007 中工作)以导入由第三方 DLL 文件导出的函数。 DLL 文档是 C++ 特定的。我对这种事情的经验有限。

一般的做法当然是这样的:

interface

function SaveAsWavFile (Handle: Cardinal; FileName: WideString): HResult; stdcall;

implementation

function SaveAsWavFile; external 'SOMELIBRARY.DLL';

我遇到的情况是DLL中的函数名嵌入了双冒号。使用 DLL Export Viewer (www.nirsoft.net/utils/dll_export_viewer.html),导出的函数名称报告为“IOperation7::SaveAsWavFile”。

Delphi name 指令似乎有帮助,但以下代码导致运行时错误“无法找到过程入口点 IOperation7::SaveAsWavFile...”

function SaveAsWavFile; external 'SOMELIBRARY.DLL' name 'IOperation7::SaveAsWavFile';

变体(单冒号、点)也不起作用。我还尝试了使用 DLL Export Viewer 报告的序号的 Delphi index 指令,但无济于事。我没想到它会起作用,因为似乎每个序数都被多个函数使用。这让我产生了下一个怀疑。

我不确定 :: 字符的意义,但我现在怀疑它们与 DLL 中的 嵌入类 有关。所以,如果我的怀疑是正确的,我上面的问题也许更好地表述为“如何在 DLL 中包含的类中使用 Delphi 函数?”

编辑: 这是来自 .h 文件的实际参考。我意识到它与我上面发布的代码不太匹配 - 我试图让我发布的示例保持简单。

virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE FdSaveAsWavFile(
/* [in] */ ULONG handle,
/* [in] */ BSTR newFileName,
/* [in] */ ULONG newAudioFormat,
/* [in] */ ULONG failIfExists,
/* [in] */ IOLDMFileProgressNotification *progress) = 0;

【问题讨论】:

  • 我知道在实际的 Delphi 代码中可能无法找到答案,因为我可能遗漏了我未能识别为重要的必要信息。对于一般问题的体面参考资料,我会很高兴。
  • 所以你是说一些可悲的第三方决定将 C++ 名称修改作为读者的练习,你是谁?您是否知道 C++ 类名修饰是多么可怕的混乱,这是多么痛苦?我建议你在 dll 上运行 MS dumpbin util 并找出它的真正名称。 support.microsoft.com/kb/177429?wa=wsignin1.0 (DUMPBIN /EXPORTS mydll.dll) 我认为 DLL 中的 C++ 损坏的导出是无能的标志。 (不是你的,谁写了那个 DLL。)它也不会是 WideString (那是一个 Delphi 类型)。发布 .hpp 类声明。
  • @Warren WideString 只不过是 COM BSTR
  • 这看起来非常像接口上的函数。我将从 C++ 头文件开始。
  • 哦,你认为它是 COM 接口还是原生 C++ 接口?很难猜。 Eric,除非您发布 C++ 类声明的相关 sn-p,否则您的问题无法回答。

标签: delphi dll


【解决方案1】:

如果这是一个由 DLL 导出的 C++ 类,那么您需要编写一个 C++ 包装 DLL 以将其转换为可供 Delphi 使用的东西。这是因为 C++ 类只能由 C++ 代码使用,就像 Delphi 类只能由 Delphi 代码使用一样。

如果这是一个接口,那么您可以直接使用 DLL。如果接口与 COM 兼容,那么您的状态可能会更好。您需要知道如何实例化对象。是COM吗?还是调用DLL导出的函数?

您将无法使用 PE 查看器来猜测这一点。您需要研究 DLL 的文档和头文件。这才是二进制接口的真正规范。


关于您的更新,这看起来像是来自接口的方法。这就是接口方法的样子。但是,仍然没有足够的信息可以肯定地说。

【讨论】:

  • 在星期一我头脑清醒的时候,我会查看 SDK 的内容,看看我是否可以发现一个包装 dll。可能会很棘手,因为 SDK 只是方程式的一半——它还需要安装 SDK 所要安装的商业软件(SDK 基于 SDK 中不包含的 DLL,这是一个很大的烦恼来源为了我)。结果是,在默认安装路径下,到目前为止我发现的至少 4 个完全不同的位置都有 DLL。
  • 肯定是这个东西的文档,不管它是什么(你为什么不告诉我们?),告诉你怎么称呼它。是COM接口吗?它是一个 C++ 接口吗?我仍然认为您在浪费时间寻找 DLL。使用 SDK、头文件、文档。 DLL 是您以后可能需要了解的实现细节。首先,弄清楚这是什么东西。
  • 抱歉,我并没有试图隐藏 SDK,我只是试图将问题缩减到最少的绒毛细节。 SDK 为 FileDownloadSDK_v206。这是来自 Olympus,用于他们的手持数字录音机(用于转录)。我能够以相对较小的难度在 Delphi 中获得另一个相关的 SDK (DSS&DSSProSDK_v200)。但它没有这种用于 DLL 导出的双冒号“IOOperation7::SaveAsWavFile”格式,而且 .h 文件更直接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
相关资源
最近更新 更多