有没有一种好方法可以强制在任何时候只能创建我的 COM 对象的一个实例(由进程内服务器提供服务)?
目前我正在 TMyObjectImpl 的构造函数中创建一个 Windows 互斥锁;如果互斥体已经存在,那么我设置一个标志以将我的对象置于“死”状态:当设置此标志时,接口函数的所有实现都将返回一个错误代码。
我想抛出一个异常而不是像这样创建一个“死”对象,但是跨 COM 边界抛出 C++ 异常并不好,我不确定 COM 的 C++Builder 实现是否可以处理这个问题可靠。
实际上有两种可能的问题场景:
- 相同的过程创建两个 MyObject
- 两个不同的进程分别创建一个 MyObject
互斥锁可以防止这两种情况。
我的对象工厂函数是:
static void createFactory()
{
new TCppAutoObjectFactory<TMyObjectImpl>(Comserv::GetComServer(),
__classid(TMyObjectImpl),
CLSID_MyObject,
Comobj::ciMultiInstance,
Comobj::tmSingle);
}
#pragma startup createFactory 32
根据 C++Builder DocWiki,设置 Instancing 属性对进程内服务器没有影响 -ciMultiInstance
即使您指定ciSingleInstance
.
我的对象需要这个属性,因为它访问全局资源(例如写入特定磁盘位置的文件);对象的语义是这样的,一次只应该打开一个。我不希望添加对我的对象的多个实例的支持。