我正在为一个软件编写插件。该软件调用
void Init() {...}
加载并具有多线程功能:程序可以运行多个线程,并且可以同时从我的插件调用自定义函数。
在我的插件中,我使用了我按照以下方式初始化的 COM 对象:
void Init() { // "Global" initializaton
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
position.CreateInstance(__uuidof(Position));
order.CreateInstance(__uuidof(Order));
}
接下来我实现基于插件的功能(示例):
int SendOrder(....) {
return order.SendOrder(...); // invoke COM object's method
}
问题是这个变体没有按预期工作,所以我将 COM 对象实例化直接移动到函数体:
int SendOrder(....) {
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
order.CreateInstance(__uuidof(Order));
int ret = order.SendOrder(...);
CoUnitialize();
return ret;
}
现在 COM 对象将在每个函数调用上被实例化,并且这个变体按预期工作(每个线程现在都有它自己的单元和对象的实例),但恐怕这不是最好的解决方案,因为实例化是昂贵的操作。
这可以做得更好吗?