1

问题:如何在 Delphi 中导入名为“IOOperation7::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名称指令似乎可能有所帮助,但以下代码导致运行时错误“无法找到过程入口点 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;
4

1 回答 1

0

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

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

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


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

于 2013-03-22T21:28:43.943 回答