草庐IT

c++ - 如何正确地将 _bstr_t 重置为 `NULL`

在下面的代码片段中(循环的简化场景)_bstr_toriginal(OLESTR("MyString"));//ref-count=1_bstr_tanother;another=original;//ref-count=2//dosomethingwithanotheranother.Assign(NULL);//expected:ref-count=1,andanother=NULL//resetanothertoNULLbeforedoingotheroperations在another.Assign(NULL)之后我期望的是:SysFreeString()未被调用另一个设置为N

c++ - 尝试打开 COM 端口 C++ 时出现 FILE_NOT_FOUND

我正在尝试使用C++打开一个用于读写的com端口,但我似乎无法通过实际打开它的第一阶段。我在handle上得到一个INVALID_HANDLE_VALUE使用GetLastErrorFILE_NOT_FOUND。我在网上搜索了几天,我的想法很新鲜。我也在这个网站上搜索了所有关于COM的问题。我已经扫描了现有的端口(或者我相信是这样)以获得正确的端口名称。我还尝试了_T("COM1")与斜线、不带斜线、带冒号、不带冒号和不带_T的组合我在64位机器上使用Windows7。这是我得到的代码我很高兴对此有任何意见voidSendToCom(char*data,intlen){DWORDcbN

c# - C# COMponent 引发的异常消息是否通过互操作传递给 C++?

如果我在C#类中实现一个COM接口(interface),它将被C++模块调用,那么在失败的情况下,C#代码应该抛出异常;这将由互操作层编码为HRESULT故障代码。但是传递给异常构造函数的任何消息文本(或其他信息)是否也可用于调用C++代码?如果是,如何获取它,即哪些API方法?例如如果在我的C#代码中我确实thrownewArgumentException("Theemailaddressisinvalid")我会排除我的COMHRESULT为E_INVALIDARG但是我的自定义文本会被编码还是我可以只查找E_INVALIDARG的文本描述吗? 最佳答

c++ - QDrag 在拖动时被破坏

我有一个在QTreeView中使用拖放操作的Windows/LinuxQt4.3应用程序。我有两个非常相似的应用程序,它们使用同一组Qt库。拖放在Linux上适用于两者,但在Windows上仅适用于一个。在不起作用的应用程序中,一旦移动鼠标,QDrag对象就会被删除。它由事件队列中的DeferredDelete事件删除,事件队列在拖动期间仍在Qt中处理。我不知道如何查看导致QDrag对象过早删除的原因。我想不出调试这个问题的好方法。我比较了来源,找不到任何明显的东西。我曾尝试在另一个应用程序中使用其中一个应用程序的代码。有什么建议吗?更新:QDrag操作失败的原因是COM没有初始化成功

c++ - 当大小相同时使用派生对象数组作为基础对象数组 (CComVariant/VARIANT)

我使用的代码将派生对象数组视为基础对象数组。两个对象的大小相同。我想知道:这在实践中是否安全,请记住代码只会在Microsoft编译器上编译?这是我的例子:BOOST_STATIC_ASSERT(sizeof(VARIANT)==sizeof(CComVariant));//auto_arraydeletes[]thepointerifdetach()isn'tcalledattheendofscopeauto_arraybuffer(newCComVariant[bufferSize]);//...Codethatsetsthevalueofeachelement...//Thist

C++11 检查成员的 COM 智能指针

我有一堆类似集合的COM接口(interface),我正在尝试为其编写类似STL的迭代器。我已经让迭代器正常工作并专门化了begin()和end()来返回我的迭代器。一切都很完美!除了,当我尝试使用begin(std::vector)时,它使用的是我对begin()的非常一般的特化。由于这些COM对象不是从基础集合对象扩展的,所以我首先尝试:templateCollectionIteratorbegin(CollTypecoll)我明白为什么重载解析没有为std::vector选择正确的begin(),但我不确定如何解决这个问题。不幸的是,我没有一个基集合类来专门针对coll参数。我假

c# - 客户端获取从 C++ COM dll 返回的字节数组

我在C++COM头文件和IDL文件中有这个声明://Headerfile:#defineMAX_LENGTH320typedefBYTEPRE_KEY[MAX_LENGTH];//IDLfile:#defineMAX_COUNT10HRESULTSave([in]DWORDdwCommand,[in]floatfdata[MAX_COUNT],[out]PRE_KEY*phKey);这是C#客户端代码://AfterC#interopcompilation,themethod'ssignatureinC#becomes:Save(uintdwCommand,float[]fdata,o

c++ - 实现 DllRegisterServer 方法

我正在尝试实现COM的DllRegisterServer方法。所以我读了这个教程:http://www.codeguru.com/cpp/com-tech/activex/tutorials/article.php/c5567/Step-by-Step-COM-Tutorial.htm然后我按照步骤进行,直到DllRegisterServer部分。这是他们的实现:HRESULT__stdcallDllRegisterServer(void){////AsperCOMguidelines,everyselfinstallableCOMinprocesscomponent//shoulde

c++ - 在 C++ Builder 中使用 COM

我是COM库的新手,一直坚持在我的C++Builder(XE2)应用程序中使用COMDLL。DLL已注册。允许我创建属于此类DLL的对象并调用它们的方法的步骤是什么?我的意思是静态的。我找不到教程,但我看到了不同的方法:Component>Importcomponent>它会生成一个新的包装器单元...然后呢?用绝对路径导入DLL(为什么?它在系统中注册了)#import"C:\Path\to\the\LIB1.dll"rename_namespace("LIB1")...然后呢?使用CoCreateInstance...具体怎么做?没有导入/包含?在VisualC#中,我处理它只是添

c++ - 当 CComPtr 作为类的成员变量时如何销毁它?

当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