moo*_*ogs 6 .net windows com windows-7
我有一个现有的COM Exe Server,以及调用它的VBA或.NET代码.我们希望无需安装或修改注册表即可使其工作,以便其计算机上不是管理员的其他用户可以使用它.
我们假设无法更改/修改COM Exe Server(昂贵).
问题1: 根据我在注册正在运行的EXE服务器中所做的工作,EXE服务器可以调用CoRegisterClassObject在类表中注册CLSID.这是否意味着客户端应该能够从那里获得CoGetClassObject?(甚至没有该类型/类的注册表项?)
问题2: 如果以上是正确的,我的EXE服务器使用CComModule(不建议使用,是的),我可以看到确实在调用CoRegisterClassObject.有没有办法验证类表,所以看到是否正确完成?
问题3:
这是我正在使用的片段.clsid和iid指的是相应的clsid和iid guids.它在CreateInstance调用中未注册接口(HRESULT异常:0x80040155)失败.这让我感到难过,任何可能出错的想法?
var factory = UnsafeNativeMethods.CoGetClassObject(
clsid,
RegistrationClassContext.LocalServer,
IntPtr.Zero,
typeof(UnsafeNativeMethods.IClassFactory).GUID)
as UnsafeNativeMethods.IClassFactory;
factory.CreateInstance(null, ref iid, out obj);
Run Code Online (Sandbox Code Playgroud)
问题1:根据我在注册正在运行的EXE服务器中所做的工作,EXE服务器可以调用CoRegisterClassObject在类表中注册CLSID.这是否意味着客户端应该能够从那里获得CoGetClassObject?(甚至没有该类型/类的注册表项?)
是.CoRegisterClassObject将足够(没有注册表)使您的out-of-proc对象可供任何调用的客户端CoCreateInstance使用CLSCTX_LOCAL_SERVER.但是,您可能遇到编组调用问题,因为未注册COM代理/存根DLL和/或类型库.因此,像一个众所周知的接口IDispatch,IOleCommandTarget等会毫无问题地封送,但任何自定义界面将会失败.
但是,还有其他方法可以让客户端使用EXE服务器.仅举几例:RegisterActiveObject,IRunningObjectTable.
问题2:如果以上是正确的,我的EXE服务器使用CComModule(不建议使用,是的),我可以看到确实在调用CoRegisterClassObject.有没有办法验证类表,所以看到是否正确完成?
我只能想到调用CoGetClassObject或CoCreateInstance(或者需要CLSCTX_LOCAL_SERVER标记)来验证.
问题3:这是我正在使用的片段.clsid和iid指的是相应的clsid和iid guids.它在CreateInstance调用中未注册接口(HRESULT异常:0x80040155)失败.这让我感到难过,任何可能出错的想法?
那真是怪了.如果COM标准封送程序找不到接口的代理/存根工厂,则它返回0x80040155(REGDB_E_IIDNOTREG),但IClassFactory不需要自定义代理.你确定你GUID的C#定义是正确的IClassFactory吗?那应该是Guid("00000001-0000-0000-C000-000000000046").
| 归档时间: |
|
| 查看次数: |
978 次 |
| 最近记录: |