具有自定义访问权限的C#Out-of-proc COM服务器

时间:2016-02-19 08:54:05

标签: c# c++ com moniker

我需要在C#中实现一个out-ofproc服务器。完成了基本的服务器部分,并且progid可以访问服务器,如下所示:“someNamespace.someClassname”。

但现在我想要这样的东西:“progid:Application(set = somevalue)”。

有没有办法在C#中执行此操作?

到目前为止,我注册了一个工厂,这个工厂返回了com对象。

        Guid appClsId = new Guid(ComCst.ApplicationId);

        int hRes = ComNtv.CoRegisterClassObject(ref appClsId, new ApplicationFac(), 
            CLSCTX.LOCAL_SERVER, REGCLS.MULTIPLEUSE | REGCLS.SUSPENDED, out cokAppObj);
        if (hRes != 0)
        {
            throw new ApplicationException(
                "CoRegisterClassObject failed w/err 0x" + hRes .ToString("X"));
        }

        hRes = ComNtv.CoResumeClassObjects();
        if (hRes != 0)
        {
            if (cokAppObj!= 0)
            {
                ComNtv.CoRevokeClassObject(cokAppObj);
            }

            throw new ApplicationException(
                "CoResumeClassObjects failed w/err 0x" + hRes .ToString("X"));
        }

这是工厂中的CreateInstance方法。

public int CreateInstance(IntPtr pUnkOuter, ref Guid riid,
        out IntPtr ppvObject)
    {
        ppvObject = IntPtr.Zero;

        if (pUnkOuter != IntPtr.Zero)
        {
            Marshal.ThrowExceptionForHR(ComCst.CLASS_E_NOAGGREGATION);
        }

        if (riid == new Guid(ComCst.ApplicationId) ||
            riid == new Guid(ComCst.IID_IDispatch) ||
            riid == new Guid(ComCst.IID_IUnknown))
        {
            IntPtr ptr = Marshal.GetComInterfaceForObject(
               new Application(), typeof(IApplication));

            ppvObject = ptr;
        }
        else
        {
            Marshal.ThrowExceptionForHR(ComCst.E_NOINTERFACE);
        }

        return 0;
    }

信息:已经实现了一个c ++进程内com服务器,它正在创建一个对象并在运行对象表中注册它。此服务器比将返回名称返回给客户端。是否有可能在C#中实现这一目标?

0 个答案:

没有答案