如何在Delphi中声明调用这一个在C++定义的函数? c++写的跨平台dll,函数接口是这样:STDMETHODIMP CFun::GetMyFileName(BSTR SrcFileName, BSTR *MyFileName)请问在delphi中如何声明这函数去调用它? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对方给出的源码函数结构是这样,具体我也不太清楚,对COM跟C++里的东西不熟 跟一下不就看到了,这个宏展开后就是 __stdcall#define STDMETHODIMP HRESULT STDMETHODCALLTYPE#define STDMETHODCALLTYPE __stdcallCFun.GetMyFileName(SrcFileName:PWideChar, BSTR PPWideChar);stdcall; CFun.GetMyFileName(SrcFileName:PWideChar; MyFileName:PPWideChar);stdcall;// CFun 不知是名字空间还是类名,自己判断 楼上正解,可在Delphi里我这样声明这个接口还是不对:procedure GetMyFileName(SrcFileName:PWideChar; MyFileName:PPWideChar); stdcall; external 'ThisTest.dll'; CFun.GetMyFileName(SrcFileName:PWideChar; MyFileName:PPWideChar) :Integer;stdcall;external 'ThisTest.dll'; 这样也不行function GetMyFileName(SrcFileName:PWideChar; MyFileName:PPWideChar): integer; stdcall; external 'ThisTest.dll';对C++实在陌生得不行 导出类方法不是标准的dll导出。我觉得delphi不支持。 这个DLL听说可以在不同平台上调用(linux或Win),所以才使用的BSTR类型,尝试了很多种不同的声明接口方法,都没管用 type TMyFileName = ^WideChar;function GetMyFileName(SrcFileName: PWideChar; var MyFileName: TMyFileName) : integer; stdcall; external 'ThisTest.dll';var str1: PWideChar; str2: TMyFileName;begin str1 := 'aaaaa.txt'; GetMyFileName(str1, str2); ShowMessage(PWideChar(str2));end;呃,试试 除非dll这个GetMyFileName声明为static静态方法才行,这dll是啥玩意,楼主看看它的文档说明啊,接口咋公开的? 他原来给的函数接口说明其实是这样的char * GetMyFileName(char * SrcFileName)上面的接口我一般是使用下面的声明方法:function GetMyFileName(SrcFileName: PChar): PChar; cdecl(或stdcall); external 'ThisTest.dll';用这种声明方法,不管是C#写的还是C++写的DLL,只要DLL本身没问题,一般都可以正常使用。但偏偏他的这个DLL我这样声明没法加载,后来写DLL的那人说可能他是Linux下写的,所以才换成STDMETHODIMP CFun::GetMyFileName(BSTR SrcFileName, BSTR *MyFileName),不过换成这种之后试过各种声明方法,还是没法加载 CFun如果是类的话就比较麻烦,如果是namespace的话函数也会被重命名.你应该用DLL函数查看器,看一下真正的函数名是什么 人家是 char * GetMyFileName(char * SrcFileName);你弄成 STDMETHODIMP CFun::GetMyFileName(BSTR SrcFileName, BSTR *MyFileName);是你乱来嘛,这根本就是另一个函数了 sololie兄,他本来是char * GetMyFileName(char * SrcFileName);可这接口没法用之后他才改成STDMETHODIMP CFun::GetMyFileName(BSTR SrcFileName, BSTR *MyFileName);现在问题也还没解决,只能先放着了 SQL中IMAGE类型数据 Delphi 2006-06专家榜 DBGRID的问题 dephi5程序如何用 winsock2 在线等待 谢谢!!! 各位大虾,在线等待!在线程中利用全局的TAdoDataSet执行存储过程报错:无法获取返回数据集! 兄弟们,我老姐给兄弟介绍了个mm 怎样使speedButton透明,能看到背景,却有凸起的状态, 怎样用DBGrid连接多个表,不用SQL,在线等候。 关于抽奖 哪位仁兄有Model Maker 5 的注册码? Delphi 报表那几个好用。 delphi 数据库初始化错误
#define STDMETHODCALLTYPE __stdcallCFun.GetMyFileName(SrcFileName:PWideChar, BSTR PPWideChar);stdcall;
// CFun 不知是名字空间还是类名,自己判断
procedure GetMyFileName(SrcFileName:PWideChar; MyFileName:PPWideChar); stdcall; external 'ThisTest.dll';
:Integer;stdcall;external 'ThisTest.dll';
function GetMyFileName(SrcFileName:PWideChar; MyFileName:PPWideChar): integer; stdcall; external 'ThisTest.dll';对C++实在陌生得不行
type
TMyFileName = ^WideChar;function GetMyFileName(SrcFileName: PWideChar; var MyFileName: TMyFileName)
: integer; stdcall; external 'ThisTest.dll';var
str1: PWideChar;
str2: TMyFileName;
begin
str1 := 'aaaaa.txt';
GetMyFileName(str1, str2);
ShowMessage(PWideChar(str2));
end;
呃,试试
char * GetMyFileName(char * SrcFileName)
上面的接口我一般是使用下面的声明方法:
function GetMyFileName(SrcFileName: PChar): PChar; cdecl(或stdcall); external 'ThisTest.dll';
用这种声明方法,不管是C#写的还是C++写的DLL,只要DLL本身没问题,一般都可以正常使用。但偏偏他的这个DLL我这样声明没法加载,后来写DLL的那人说可能他是Linux下写的,所以才换成STDMETHODIMP CFun::GetMyFileName(BSTR SrcFileName, BSTR *MyFileName),不过换成这种之后试过各种声明方法,还是没法加载
你应该用DLL函数查看器,看一下真正的函数名是什么
你弄成 STDMETHODIMP CFun::GetMyFileName(BSTR SrcFileName, BSTR *MyFileName);
是你乱来嘛,这根本就是另一个函数了
STDMETHODIMP CFun::GetMyFileName(BSTR SrcFileName, BSTR *MyFileName);
现在问题也还没解决,只能先放着了