问题:如何在Delphi中导入一个名为“IOperation7 :: SaveAsWavFile”的DLL函数?在Delphi中使用C++类函数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”。
德尔福名指令好像它可能会帮助,但下面的代码导致运行时错误“过程入口点IOperation7 :: SaveAsWavFile找不到......”
function SaveAsWavFile; external 'SOMELIBRARY.DLL' name 'IOperation7::SaveAsWavFile';
变化(单个冒号,点)也没有工作。我也尝试了Delphi 索引指令,并通过DLL导出查看器报告序号,但无济于事。我没有想到它会起作用,因为看起来每个序号都被多个功能使用。这导致我下一个怀疑。
我不确定::字符的意义,但我现在怀疑它们与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代码中的答案可能是不可能的,因为我可能遗漏了我没有认识到的重要信息。我会很高兴指出一般问题的体面参考资料。 – 2013-03-22 21:02:06
所以你说有些伤心的第三方决定把C++的名字作为练习给读者,这是你吗?你是否意识到一个可怕的混乱的C++类的名字是怎么回事,这是多少痛苦?我建议你在dll上运行MS dumpbin util并找出它真正叫做的东西。 http://support.microsoft.com/kb/177429?wa=wsignin1.0('DUMPBIN/EXPORTS mydll.dll')我认为DLL中的C++ - mangled导出是无能的表现。 (不是你的,谁写的那个DLL。)另外它不会是WideString(这是一个Delphi类型)。发布.hpp类声明。 – 2013-03-22 21:04:56
@Warren WideString不过是COM BSTR – 2013-03-22 21:12:32