【发布时间】: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,否则您的问题无法回答。