1

有没有一种好方法可以强制在任何时候只能创建我的 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.

我的对象需要这个属性,因为它访问全局资源(例如写入特定磁盘位置的文件);对象的语义是这样的,一次只应该打开一个。我不希望添加对我的对象的多个实例的支持。

4

0 回答 0