排除STL,我只在C++windows编程中找到了CComPtr。WindowsSDK中是否还有其他类型的智能指针?谢谢。 最佳答案 首先,STL和boost的智能指针在Windows上可用,使用它们没有任何问题。说到纯粹的Windows内容,COM接口(interface)指针及其AddRef/Release生命周期管理模型很容易成为智能指针。在特定于Windows的库中有一些智能指针类专门用于存储COM接口(interface)指针。除了ATL的CComPtr,还有MicrosoftNativeCOM的_com_ptr_t,还有
我正在使用SAPI5API处理文本到语音。如果我简化我的代码如下所示(我删除了错误检查以尽可能简化它):intmain(){CoInitialize(NULL);CComPtrspVoice;spVoice.CoCreateInstance(CLSID_SpVoice);...CoUninitialize();return0;}由于某些奇怪的原因,如果我不调用spVoice.Release(),我的代码就会崩溃。所以上面的代码崩溃了,但是这段代码工作得很好:intmain(){CoInitialize(NULL);CComPtrspVoice;spVoice.CoCreateInsta
我正在用C++在WindowsCOM中编写一个程序,我正在使用CComPtr作为智能指针。我找不到答案的问题是-我可以在std::map中使用CComPtr吗?我有以下代码片段(已简化):std::map>ErrorMap;我希望维护int和IErrorInfo错误信息之间的映射。但是我不确定我是否可以执行以下操作:CComPtrresult;GetErrorInfo(0,&pErrInfo);ErrorMap.insert(std::make_pair(0,result));我担心result智能指针的所有权,以及当ErrorMap被销毁时它是否会正确释放?
当CComPtr作为类的成员变量时,如何销毁它?下面是我写的一段代码,m_piControl是成员变量CComPtr。我已将m_piControl的值分配给rpControl和rpControl以供进一步使用。HRESULTCSession::GetInterface(OUTCComPtr&rpControl){if(m_piConSIControl==NULL){CComPtrpConDM;HRESULThResult=GetMaintenance(&pConDM);if(FAILED(hResult))returnhResult;CComQIPtrpMaintenance(pCon
我有点习惯通过COM进行引用计数的概念,但我对shared_ptr有点陌生。我在shared_ptr中没有找到CComPtr的几个不错的属性,我想知道防止误用shared_ptr的模式是什么。AddRef/Release模式保证每个对象只有一个引用计数(引用计数存储在对象本身),因此当您有一个随机指针围绕它创建一个CComPtr时,它是安全的。另一方面,shared_ptr有一个单独的refcount指针,所以在一个对象上创建一个新的shared_ptr是不安全的(为什么标准提供了一个构造函数,它在shared_ptr上采用T*,如果这样做很不安全?)。这似乎是一个很大的限制,我不明白
我正在查看一些处理Windows成像组件库的遗留C++代码,我观察到这一点:voidsetProperties(IPropertyBag2*constpBag){pBag->Write(...);}voidother_function(){CComPtrpBag;//CodetoinitializepBagsetProperties(pBag);}setProperties方法只是将一堆属性写入属性包。代码编译并运行良好,因为我认为它调用了适当的类型转换运算符。我的问题是是否推荐这样的接口(interface),或者是否有更好的传递指针的方法。例如,如果将签名更改为:voidsetPr
我正在编写一个ATL项目,我想知道我应该如何在这里创建类。现在我有一个类是由Add/Class/ATLSimpleObject创建的。我想将它分成更小的类,但此类中的方法应该使用CComPtr并将CComPtr作为参数。我无法创建“简单”的C++类,因为那里没有CComPtr。我是否应该通过ATL简单对象向导创建ATL类,然后使用该类的接口(interface)来调用方法。喜欢这里:CComPtrtptr;tptr.CoCreateInstance(CLSID_TestAtlClass);tptr->test();我应该通过ClassView/ITestAtlClass/Add/Add
我正在为InternetExplorer(BHO)编写附加组件,并且正在使用CComPtr智能指针。我想知道:我什么时候应该使用CComPtr.Release()函数?在这个this用于发布的链接浏览器对象。我还应该在哪里使用它?在“正常”使用中(使用我自己的类(class))我不需要它。我应该在这种情况下使用它吗:我使用m_spWebBrowser->get_Document(&spDispDoc)获取文档对象:voidSTDMETHODCALLTYPECHelloWorldBHO::OnDocumentComplete(IDispatch*pDisp,VARIANT*pvarURL