VC中可以这样实现IDirectDraw*   mypDD;DirectDrawCreate( 0, &mypDD, 0 );
对应的在delphi中 我这样写的var  mypDD:IDirectDraw;//这样是不是就定义了一个接口指针?正确吗?DirectDrawCreate(nil,@mypDD, nil);//这一句提示错误 提示形参和实参不一致 请大家帮忙看看错在哪里?

解决方案 »

  1.   

    如果我把这一句改成 DirectDrawCreate(nil,mypDD, nil); 这样就可以编译通过 请问为什么?
    我知道VC中引用是用符号&    delphi中的引用不是应该加上@吗?
      

  2.   

     mypDD 得定义成指针。
      

  3.   

    怎么样才能定义成指针呢?var mypDD : ^IDirectDraw;  这样定义正确吗  好像也不对
      

  4.   

    type PIDirectDraw = ^IDirectDraw end;
    var mypDD :PIDirectDraw;
      

  5.   

    一涉及接口,delphi 区专家们的老底儿就露出来了,各种胡说八道。具体怎么调,要看 DirectDrawCreate 是怎么翻译的。从 lz 给出的信息来看,第2个参数应该翻译成的是DirectDrawCreate(..., out x: IDirectDraw, ...)
    // or
    DirectDrawCreate(..., var x: IDirectDraw, ...)按照 msdn 上给出的 DirectDrawCreate 参数说明,要是我翻译的话会翻成前者,后者还是有可以让粗心的使用者的程序产生内存泄露。
    所以 DirectDrawCreate(nil, mypDD, nil) 的调用是正确的,2l、3l、6l 的回答都是不懂装懂。至于为什么,我只能这么讲:var/out 是传引用,也就是实际上传的是实参的地址,和 c++ 里加 & 修饰的引用传参(如:void foo(int&);)道理是一样的(out 还会在调用方多一步处理,用来把原值清零)。
    lz 要是看不懂的话,就是基础的问题了,我也没办法
      

  6.   

    Seamour不愿意解释,那我就解释一下 var和out,我还是那句话IDirectDraw不是指针,mypDD为var类型,var参数传递过去就是IDirectDraw的引用,再加上@,意思就变了out类型参数,接收返回值,抛弃原来值,所以你的mypDD如果初始化,并以out类型传递,初始值就会成为垃圾,这就是Seamour所说的内存泄露吧(?)DirectDrawCreate 顾名思义吧,创建一个对象,mypDD以out类型传递后,返回创建的对象,应该是这么理解吧
    我没看什么msdn,全是个人理解
      

  7.   

    明明是二级指针,不管DirectDrawCreate咋翻译,mypDD必须是指针。
      

  8.   

    HRESULT WINAPI DirectDrawCreate(
    GUID FAR *lpGUID, 
    LPDIRECTDRAW FAR *lplpDD, 
    IUnknown FAR *pUnkOuter 
    ); 
    第二项参数是IDirectDraw接口类型指针的地址