2013-03-22 102 views
1

问题:如何在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; 
+0

我明白在实际的Delphi代码中的答案可能是不可能的,因为我可能遗漏了我没有认识到的重要信息。我会很高兴指出一般问题的体面参考资料。 – 2013-03-22 21:02:06

+0

所以你说有些伤心的第三方决定把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

+1

@Warren WideString不过是COM BSTR – 2013-03-22 21:12:32

回答

0

如果这是由DLL导出的C++类,那么你需要写一个C++包装DLL将它转化成一些可以由德尔福消耗。这是因为C++类只能被C++代码使用,就像Delphi类只能被Delphi代码所使用一样。

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

你将无法用PE浏览器猜测这个。您需要研究DLL的文档和头文件。这是二元接口的真正规范。


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

+0

周一,当我的大脑新鲜时,我会回顾SDK的内容,看看我是否可以发现一个包装DLL。可能会比较棘手,因为SDK只是其中的一半 - 它还需要安装SDK的商业软件(SDK基于SDK中未包含的DLL,这已成为激怒的重要来源为了我)。结果是,在默认安装路径中,至少有4个完全不同的位置的DLL,至今我找到了。 – 2013-03-22 22:01:38

+0

当然,这个东西的文档,不管它是什么(为什么你不告诉我们?),告诉你如何调用它。它是一个COM接口吗?它是一个C++接口吗?我仍然在浪费你的时间寻找DLL。使用SDK,头文件,文档。这些DLL是您可能需要稍后知道的实现细节。首先,弄清楚这是什么。 – 2013-03-22 22:05:01

+0

对不起,我没有试图隐藏SDK,我只是试图将问题归结为最小数量的绒毛细节。 SDK是FileDownloadSDK_v206。这是奥林巴斯的手持式数字录音机(用于转录)。我能够以相对较小的难度获得其他与Delphi相关的SDK(DSS&DSSProSDK_v200)。但是它没有这个用于DLL导出的双冒号“IOperation7 :: SaveAsWavFile”格式,并且.h文件更直接。 – 2013-03-25 14:59:39