原型:
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;

解决方案 »

  1. 第一种,习惯delphi也这么写
    第二我觉得也可以,不过不会最先考虑
      

  2. 为什么不考虑第三,第四种实现?
    delphi里传递对象参数,要不要加var关键字?
    接口引用和对象引用,是不是可以作为指针使用?接口引用和对象引用有木有差别?按照第一种实现,出现privileged instruction异常。第二种出现读地址错。
      

  3. delphi里面的接口和对象类型的变量本身就是指针:)
    至于第三个参数是个双重指针:)
      

  4. 示例代码:)#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.
      

  5. 第三,四种:
    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;
      

  6. 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.
      

  7. HRESULT XCreateService(IUnknown *pIUnkOuter,IServerX *pIServ,IUnknown **ppIUnk);在C++中 二级指针也会这样的IUnknown* &ppIUnk;;;所以 跟 var ppIUnk:PIUnknown):HRESULT;
    这样类似。。不过个人习惯感觉是第一种
      

  8. 参数形式 pIunkOuter:PIUnknown 和
    参数形式var pIunkOuter: IUnknown
    是一样的,以此类推,所以1、2正确,3、4错误
      

  9. 呵呵,Delphi & C++Builder偶都经常用。
      

类似问题 »