使用C++dll中的COM对象
Using COM Object in C++ dll
我正在编写一个Win32 C++DLL,该DLL使用C#中生成的COM对象(B.DLL)。这个dll(A.dll)提供CMyComObject类,该类创建COM对象并访问它。这是我的密码。
void CMyComObject::CMyComObject()
{
HRESULT result = CoInitialize(NULL);
...
result = CoCreateInstance(CLSID_COMDLL, NULL, CLSCTX_INPROC_SERVER, IID_COMDLL, reinterpret_cast<void**>(&MyComObject));
}
void CMyComObject::~CMyComObject()
{
..
CoUninitialize();
..
}
然后,这里有一个客户端程序,它加载a.dll并访问COM对象。该程序创建多个线程,这些线程同时加载A.dll并创建COM对象。
在这种情况下,使用CoInitialize()函数正确吗?还是应该将CoInitializeEx()函数与COINIT_MULTITHREADED参数一起使用?或者我做错了什么?(我通过命令"reg_asm.exe B.dll B.tlb/codebase"注册了B.dll)
抱歉我英语不好。
谢谢。
您应该在该线程上的任何COM活动之前和之后使用CoInitialize[Ex]
/CoUninitialize
,并且您在CoInitialize
和CoInitializeEx
之间选择特定参数取决于您的线程是喜欢STA模式还是MTA模式。
话虽如此,您的初始化:
- 不取决于COM对象本身是否创建任何线程
- 不依赖于可能具有其他COM活动的应用程序的其他部分,包括相同COM类的类似实例化
- 完全取决于您在有问题的线程上的COM活动
- 通常不会发生在类构造函数中;典型的是在windows消息泵之前或在线程过程的一开始就进行与顶级线程代码相关联的COM初始化;将它放入构造函数是一种容易发生冲突的方法,例如与另一个初始化(特别是使用不同的公寓模型)或过早取消初始化
再次总结,您的初始化:
- 如果您对COM单线程单元模型满意,并且不在线程之间传递所获得的指针,则看起来不错
- 最好将
CoInitialize
和CoUninitialize
调用移出构造函数,并将其与线程代码关联起来 - 请务必检查返回值以检测失败,特别是尝试在已经进行COM初始化的线程上初始化不匹配的单元
- 缺少的部分是必须在
CoUninitialize
调用之前关闭所有COM活动,包括释放MyComObject
指针
相关文章:
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 如何在C++非托管/本机 DLL 中从注册免费 COM C# 托管 DLL 创建 COM 对象
- 从 WinRT C++组件访问 COM 对象
- 通过 COM 对象连接 x64 应用程序时出现问题
- 我如何知道COM对象与不同的COM UUIDS兼容
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 组件对象模型 (COM):IMalloc::Alloc 在哪里分配内存?
- 2 个 COM 对象,并在另一个对象中使用其中一个对象的接口
- 尝试向 COM 对象添加另一个接口时出现静态强制转换错误 C2440
- 在没有共享 COM 对象的情况下使用 COM STA 或 MTA?
- 如何在C++命令行界面程序中运行 COM (.ocx) 对象.(VS2017)
- 初始化com对象的问题
- UI自动化回调中com对象的所有权
- 从 COM 对象快速读取西里尔字母
- 如果从函数返回指向指针 COM 对象的指针,我是否需要 AddRef()?
- 如何通过 COM 互操作访问复杂对象的属性?
- 使用 com 对象删除计划任务
- 如何使用OlesetClipboard将我的COM对象放置在剪贴板上时解决问题
- 在自定义源和 SmartTee 之间插入筛选器会泄漏 COM 对象
- COM 对象中的回调