草庐IT

com_ptr_t

全部标签

c++ - 返回对 std::unique_ptr 的引用的原因

我想知道在C++中是否有合理的理由通过引用返回唯一指针,即std::unique_ptr&?我以前从未真正见过这种技巧,但我的新项目似乎经常使用这种模式。乍一看,它只是有效地打破/规避了“唯一所有权”契约,使得无法在编译时捕获错误。考虑以下示例:classTmContainer{public:TmContainer(){//Createsomesortofcomplexobjectonheapandstoreunique_ptrtoitm_time=std::unique_ptr(newtm());//Storesomethingmeaningfulinitsfieldsm_time-

c++ - is_assignable 和 std::unique_ptr

Here是来自gcc的测试文件,livedemostructdo_nothing{templatevoidoperator()(T*){}};intmain(){inti=0;std::unique_ptrp1(&i);std::unique_ptrp2;static_assert(!std::is_assignable::value,"");//note!here.}std::is_assignableIftheexpressionstd::declval()=std::declval()iswell-formedinunevaluatedcontext,providesthemem

C++ 多重虚拟继承与 COM

网络上充斥着对"dreadeddiamondproblem"的解释.StackOverflow也是如此。我想我有点理解,但我无法将这些知识转化为理解相似但不同的东西。我的问题一开始是一个纯C++问题,但答案很可能会分支到MS-COM细节。一般的问题是:classBase{/*purevirtualstuff*/};classDer1:Base/*Non-virtual!*/{/*purevirtualstuff*/};classDer2:Base/*Non-virtual!*/{/*purevirtualstuff*/};classJoin:virtualDer1,virtualDer

c# - 是否可以使用免注册 COM 的 COM 可见 .NET 类?

我们正在开发一个混合了.NET组件和遗留C++COM组件的ClickOnce应用程序。目前,我们正在使用MSI(这是安装我们的ClickOnce应用程序的先决条件)将C++COM组件添加到用户计算机,这意味着我们可以预先在用户计算机上注册COM对象。我们仍然可以通过ClickOnce向用C#编写的应用程序的其余部分推送更新,但更新MSI安装的组件需要手动干预。但是,我们正在尝试弄清楚是否可以通过免注册COM安装C++COM组件,即它们都在同一目录中,并且每个组件都有一个list文件,为每个COM对象指定clsid和界面。这意味着我们可以完全摆脱MSI。这link很好地介绍了这个主题。我

c++ - boost::interprocess::shared_ptr 是线程安全的(和进程间安全的)吗?

我想在线程之间共享数据,并在最后一个用户完成后自动删除它。这似乎在大多数情况下都有效,在boost::fixed_managed_shared_memory段中使用boost::interprocess::shared_ptr:但并非总是如此。那么,boost::interprocess::shared_ptr线程(和进程间)是否安全?如果我在固定地址使用我的共享内存(我很确定这在我的64位(好吧,48位)地址空间中是没问题的),是否可以使用一个普通的boost::shared_ptr(它是线程安全的)?一些说明:我使用的指针类型是普通的void*,(我的共享内存映射到一个固定地址)。

c++ - 使用 VS2010 在客户端编译 native COM 客户端 stub

我是COM编程的新手,刚开始使用VisualStudio2010创建基本的nativeCOM服务器/客户端对。客户端和服务器项目都位于同一个解决方案中。我想知道最合适的方法是将生成的客户端stub和头文件包含在客户端项目中。我在我的服务器项目中创建了MIDL,当我编译该项目时,_h.h、_i.c和_p.c文件会在我的项目源目录中生成。我是否需要编译我的客户端项目中的两个.c文件?在客户端项目中编译它们的最佳方式是将它们作为链接文件从服务器项目的源目录添加到客户端项目中吗?当我修改MIDL时,VisualStudio是否有办法知道_h.h、_i.c和_p.c文件已过时,或者我是否需要记住

c++ - 如何优雅地从 COM 错误中恢复?

我有一个第三方COM组件及其在VC++中的c++接口(interface)。我在下面的调用中崩溃了,这使我的应用程序崩溃了。我如何从这个实际上不属于我的应用程序的功能中正常恢复?inline_RecordsetPtrIGLibMgr::GetLibInfo(_bstr_tLibPath){struct_Recordset*_result=0;HRESULT_hr=raw_GetLibInfo(LibPath,&_result);if(FAILED(_hr))_com_issue_errorex(_hr,this,__uuidof(this));return_RecordsetPtr(_

c++ - 从带有原始指针的 vector 中删除 std::unique_ptr 的最佳方法?

所以我有一个像这样的vector:std::vector>myVector;然后我有另一个vector,其中包含SomeClass的原始指针:std::vectormyOtherVector;如果myOtherVector中有一个元素,它也会在myVector中,所以我想遍历myOtherVector中的每个元素并删除来自myVector的相同元素。然后清除vector。这是我想出的:for(size_ti=0;i这会产生编译时错误,因为myVector拥有唯一的指针,但我给remove()函数一个原始指针。这是我需要帮助的地方,因为我不知道解决这个问题的正确方法是什么。我将行更改为:

c++ - 在 COM 对象内部调用时 CoInitializeEx 返回 S_OK

前段时间,我不得不修改一个旧的COMDLL(VisualC++2010,ATL),将它从“Apartment”线程模型迁移到“Both”,即现在可以从STA和MTA线程调用它而无需序列化调用(当然,我必须为共享数据添加内部同步)。当我的DLL通过Interop从.NET应用程序调用时(我必须支持STA和MTA,即使在.NET应用程序中),这又导致将COM事件(连接点)转换为.NET事件时出现问题。为了解决这些问题,我改变了触发事件的方式。1)如果在STA上下文中调用DLL,它会像以前一样工作,即它创建一个不可见的窗口,然后,当必须引发事件时,它调用该窗口的PostMessage,然后主

c++ - 带有 std::shared_ptr 的 QVariant

我有以下问题,我正在使用Q_DECLARE_METATYPE(std::shared_ptr);qRegisterMetaType>();QMetaType::registerComparators>();使用std::shared_ptr与例如QList模型。我需要一种行为QVariant::fromValue(std::shared_ptr(newint(5)))==QVariant::fromValue(std::shared_ptr(newint(5)))是真的。自std::shared_ptr::operator==()以来,我上面的代码在这里返回false比较原始指针。是否