用ATL写一个插件。我需要从主程序获得一个对象的数组。
函数的定义是这样的:
      virtual HRESULT __stdcall IGetWires (
        /*[in]*/ long * Count,
        /*[out,retval]*/ struct IWire * * * Wires ) = 0;第一个参数是数组的长度,第二个参数是返回的对象。
如果不用CComPtr可以这样写:
IWire **pWires ;
hres = pRoute->IGetWires(&i,&pWires);但是如果使用智能指针CComPtr我该怎么定义呢?我尝试了
CComPtr<IWire> *spWires ;
hres = spRoute->IGetWires(&i,&spWires);

CComPtr<IWire*> spWires ;
hres = spRoute->IGetWires(&i,&spWires);但是上面两种写法都不对。
小弟第一次使用智能指针CComPtr,对它还不太了解,还请各位赐教。

解决方案 »

  1.   

    数组你应该用SAFEARRAY,用COM就要用COM的习惯,不用普通C++的习惯
    至于你这个智能指针,应该定义为CComPtr <IWire**> spWires ; 
    hres = spRoute->IGetWires(&i,&spWires); 
    不过从你定义的三重指针来看,你是打算当作二维数组来用的吧?这是在C++语言不支持的,实际上你不能访问维数不定的二维数组,语义上就不可能
      

  2.   

    sorry,应该是CComPtr  <IWire*> spWires ;  
    hres = spRoute->IGetWires(&i,&spWires);  
    你不成功是二维数组是不可能通过二维指针访问
      

  3.   

    谢谢楼上的解答。
    不过这是一个1维的数组。函数的定义是主程序那边设计的。这个3重指针,我想是这样的:第一重是指向对象的指针,第二重是数组的指针,第三重是函数调用时传址的指针。
    如果用
    CComPtr   <IWire*> spWires ; 
    编译时有下面的错误提示:
    c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlcomcli.h(134) : error C2227: “->Release”的左边必须指向类/结构/联合/泛型类型
            类型是“SWRoutingLib::IWire **”
            c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlcomcli.h(132): 编译类 模板 成员函数“ATL::CComPtrBase<T>::~CComPtrBase(void) throw()”时
            with
            [
                T=SWRoutingLib::IWire *
            ]
            c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlcomcli.h(256): 参见对正在编译的类 模板 实例化“ATL::CComPtrBase<T>”的引用
            with
            [
                T=SWRoutingLib::IWire *
            ]
            d:\develop\cabledrawing\cabledrawing.cpp(369): 参见对正在编译的类 模板 实例化“ATL::CComPtr<T>”的引用
            with
            [
                T=SWRoutingLib::IWire *
            ]
    生成日志保存在“file://d:\develop\CableDrawing\Debug\BuildLog.htm”
    CableDrawing - 1 个错误,1 个警告
    ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========
      

  4.   

    “->Release”的左边必须指向类/结构/联合/泛型类型
    这一句是关键,说明的返回结构还不是智能型指针,智能指针是一个类结构定义的,只是内部重定义了->等操作符,而且一般情况下,智能指针只支持一维数组指针,即你的三重指针可能需要你前面重新定义指针类型,我建议你再构建一个类,匹配这个结构。      virtual HRESULT __stdcall IGetWires ( 
            /*[in]*/ long * Count, 
            /*[out,retval]*/ struct IWire * * * Wires ) = 0; 
    //CComPtr    <IWire*> spWires ; class CleverPtr : public IWire
    {
    public:
       CleverPtr(IWire ***Wires){pWires = Wires; // 可以来一个强制定义}
       virtual ~CleverPtr() {}
       IWire operator*(){ return *pWires;}
       IWire* operator&() {return &pWires;}
       
    private:
       CComPtr <IWire> pWires;  //定义IWire类型的指针
    };没有使用过CComPtr指针,只是猜想着着这么个使用应该会方便一些,而且也不需要直接操作三重指针(毕竟这个是容易出错的地方)
      

  5.   

    如果是进程外组件,数组这样传出来也是不能用的,还是用SAFEARRAY吧
      

  6.   

    如果是进程外组件,数组这样传出来也是不能用的,还是用SAFEARRAY吧