多实例COM对象创建

时间:2016-12-03 16:30:26

标签: permissions com windows-services dcom opc

我有一台有OPC服务器的服务器。据我所知,它是一个简单的COM对象。 DCOM已配置且运行良好。我可以使用相同的登录名和密码(我的电脑不在域中)从其他PC简单地连接到此OPC服务器。如果我将连接将DCOM连接到服务器,将自动创建OPC服务器进程。如果我将登录到可以访问OPC对象的用户下的服务器并将连接到它,我将再获得一个OPC服务器进程。这是一个问题。我每个PC只需要一个实例。如果我将在可以访问OPC服务器对象的同一用户下安装几个Windows服务,则会出现同样的问题。每个服务都将创建一个OPC服务器对象进程。如果我使用来自一台机器的不同应用程序连接抛出DCOM,我将只为该机器进行一次处理。 OPC服务器对象是第三方。 DCOM身份无法配置为使用系统帐户,因为此单选按钮在配置窗口中被阻止(它是俄语但我认为你可以理解图片): enter image description here

我该如何解决这个问题?我如何配置系统不创建COM OPC服务器对象的新实例(如果它已经存在)?有可能吗?

更新1.我试图调用CoCreateInstanceTwice,因为@IgorTandetnik建议,但我只有实例。这意味着服务器在多用途模式下工作。测试代码:

static void CoCreateInstanceTwice()
{
    Guid guid = new Guid("39C13A4D-011E-11D0-9675-0020AFD8ADB3");
    IntPtr intPtr = IntPtr.Zero;
    IntPtr outPtr;
    try
    {

        var res = CoCreateInstance(
            new Guid("AEDE6AB0-95F9-11D4-BF93-0050BAC23960"),
            intPtr,
            4,
            guid,
            out outPtr
            );
    }
    catch (Exception ex) { WriteLine(ex.ToString()); }

    Guid guid1 = new Guid("39C13A4D-011E-11D0-9675-0020AFD8ADB3");
    IntPtr intPtr1 = IntPtr.Zero;
    IntPtr outPtr1;
    try
    {

        var res = CoCreateInstance(
            new Guid("AEDE6AB0-95F9-11D4-BF93-0050BAC23960"),
            intPtr1,
            4,
            guid1,
            out outPtr1
            );
    }
    catch (Exception ex) { WriteLine(ex.ToString()); }
    ReadLine();        
}

[DllImport("ole32.dll", EntryPoint = "CoCreateInstance", CallingConvention = CallingConvention.StdCall)]
static extern HRESULT CoCreateInstance(
    [In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid,
    IntPtr pUnkOuter,
    UInt32 dwClsContext,
    [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid,
    out IntPtr ppv
);

两次调用都会返回成功。我忘了提到要与这个COM组件通信我正在使用另一个COM组件(进程中)抛出我正在连接到服务器。 结果是一样的。抛出一个登录会话我可以使用一个对象但是如果来自一个用户的两个会话,则为每个会话抛出两个或更多系统创建它自己的对象事件。

0 个答案:

没有答案