智能指针的指针怎么做?

yourway 2008-04-18 11:30:06
用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,对它还不太了解,还请各位赐教。

...全文
235 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
这个简单啊,网上搜一下就得到答案了.
longjing_g 2008-04-23
  • 打赏
  • 举报
回复
如果是进程外组件,数组这样传出来也是不能用的,还是用SAFEARRAY吧
longjing_g 2008-04-23
  • 打赏
  • 举报
回复
如果是进程外组件,数组这样传出来也是不能用的,还是用SAFEARRAY吧
newrain021011 2008-04-21
  • 打赏
  • 举报
回复
“->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指针,只是猜想着着这么个使用应该会方便一些,而且也不需要直接操作三重指针(毕竟这个是容易出错的地方)
arong1234 2008-04-19
  • 打赏
  • 举报
回复
sorry,应该是CComPtr <IWire*> spWires ;
hres = spRoute->IGetWires(&i,&spWires);
你不成功是二维数组是不可能通过二维指针访问
[Quote=引用 2 楼 arong1234 的回复:]
数组你应该用SAFEARRAY,用COM就要用COM的习惯,不用普通C++的习惯
至于你这个智能指针,应该定义为

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

CComPtr <IWire**> spWires ;
hres = spRoute->IGetWires(&i,&spWires);
不过从你定义的三重指针来看,你是打算当作二维数组来用的吧?这是在C++语言不支持的,实际上你不能访问维数不定的二维数组,语义上就不可能
scq2099yt 2008-04-19
  • 打赏
  • 举报
回复
up
yourway 2008-04-19
  • 打赏
  • 举报
回复
谢谢楼上的解答。
不过这是一个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 已跳过 ==========

编程夜猫 2008-04-18
  • 打赏
  • 举报
回复
不懂,不过打算不久开始学习,帮你顶个先。呵呵。

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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