一个cpp的函数声明,delphi翻译如下,怎样才对?

BigBen 2005-11-18 10:41:50
原型:
HRESULT XCreateService(IUnknown *pIUnkOuter,IServerX *pIServ,IUnknown **ppIUnk);

第一种方法:
function CreateService(pIunkOuter:PIUnknown;pIServ:PIServerX;ppIUnk:PPIUnknown):HRESULT;

第二种:
function XCreateService(var pIunkOuter : IUnknown;var pIServ:IServerX;var ppIUnk : PIUnknown):HRESULT;

第三,四种:
function XCreateService(pIunkOuter:IUnknown;pIServ:IServerX;var ppIUnk:PIUnknown):HRESULT;
function XCreateService(pIunkOuter:IUnknown;pIServ:IServerX;out ppIUnk):HRESULT;

...全文
217 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
clasj 2005-11-18
  • 打赏
  • 举报
回复
示例代码:)

#include "stdafx.h"
#include "stdio.h"

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

extern "C" __declspec(dllexport) void foo(void *p, char **s){
*s = "hello world!";
printf("%d, %d\n", p, *s);
}

program testdll;

{$APPTYPE CONSOLE}

uses
SysUtils;

procedure foo(p: TObject; var s: pchar); cdecl; external 'testdll.dll';
//procedure foo(p: TObject; out s); cdecl; external 'testdll.dll'; //效果一样:)

var
p: TObject;
s: pchar;
begin
p:=TObject.Create;
writeln(integer(p), ', ', integer(s)); //此时s的值为0
foo(p, s);
writeln(integer(p), ', ', integer(s)); //s已被赋值,不为0了
p.Free;
readln;
end.
clasj 2005-11-18
  • 打赏
  • 举报
回复
delphi里面的接口和对象类型的变量本身就是指针:)
至于第三个参数是个双重指针:)
clasj 2005-11-18
  • 打赏
  • 举报
回复
第三、四种正确:)
BigBen 2005-11-18
  • 打赏
  • 举报
回复
为什么不考虑第三,第四种实现?
delphi里传递对象参数,要不要加var关键字?
接口引用和对象引用,是不是可以作为指针使用?接口引用和对象引用有木有差别?

按照第一种实现,出现privileged instruction异常。第二种出现读地址错。
constantine 2005-11-18
  • 打赏
  • 举报
回复
第一种,习惯delphi也这么写
第二我觉得也可以,不过不会最先考虑
aiirii 2005-11-18
  • 打赏
  • 举报
回复
第一反应,用 第一种方法:
柯本 2005-11-18
  • 打赏
  • 举报
回复
感觉1,2都可以
shadowstar 2005-11-18
  • 打赏
  • 举报
回复
呵呵,Delphi & C++Builder偶都经常用。
阿呆_ 2005-11-18
  • 打赏
  • 举报
回复
参数形式 pIunkOuter:PIUnknown 和
参数形式var pIunkOuter: IUnknown
是一样的,以此类推,所以1、2正确,3、4错误
beyondtkl 2005-11-18
  • 打赏
  • 举报
回复
HRESULT XCreateService(IUnknown *pIUnkOuter,IServerX *pIServ,IUnknown **ppIUnk);

在C++中 二级指针也会这样的

IUnknown* &ppIUnk;;;所以 跟 var ppIUnk:PIUnknown):HRESULT;
这样类似。。

不过个人习惯感觉是第一种。。。
很土 2005-11-18
  • 打赏
  • 举报
回复
应该使用第三和第四种方法, 第一和第二是有问题的
clasj 2005-11-18
  • 打赏
  • 举报
回复
delphi里传递对象参数,要不要加var关键字?
----------------------------------------
看需求咯,希望楼主能够理解下面的示例:)

program test;

{$APPTYPE CONSOLE}

uses
SysUtils;

procedure Test1(var obj: TObject);
begin
obj:=TObject.Create;
end;

procedure Test2(obj: TObject);
begin
obj.Free;
end;

var
obj: TObject;
begin
Test1(obj);
Test2(obj);
readln;
end.
shadowstar 2005-11-18
  • 打赏
  • 举报
回复
第三,四种:
function XCreateService(pIunkOuter:IUnknown;pIServ:IServerX;var ppIUnk:PIUnknown):HRESULT;
function XCreateService(pIunkOuter:IUnknown;pIServ:IServerX;out ppIUnk):HRESULT;

第五种:原函数没有加OUT注释,但一般情况下应该是out的。

function XCreateService(pIunkOuter: IUnknown; pIServ: IServerX; out ppIUnk: IUnknown): HRESULT;

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧