问题:如何在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;
答案 0 :(得分:0)
如果这是一个由DLL导出的C ++类,那么你需要编写一个C ++包装器DLL来将其转换为Delphi可以使用的东西。这是因为C ++类只能被C ++代码使用,就像Delphi类只能被Delphi代码使用一样。
如果这是一个接口,那么您可以直接使用DLL。如果界面与COM兼容,那么您可能会处于更好的状态。您需要知道如何实例化对象。是COM吗?或者你调用DLL导出的函数吗?
你将无法用PE观察者猜测这一点。您需要研究DLL的文档和头文件。这是二进制接口的真正规范。
关于您的更新,它看起来像是来自界面的方法。这就是界面方法的样子。但是,仍然没有足够的信息可以肯定地说。