我在用着IRunningObjectTable.Register
and IRunningObjectTable.Revoke
如图所示this http://www.codeproject.com/KB/COM/ROTStuff.aspx?msg=1879766教程。我的 VBScript 客户端最初调用方法没有问题,但是当 C# COM 服务器处理时,我总是收到“值不在预期范围内”异常。这是由于下面的注释行造成的:
private const int ACTIVEOBJECT_STRONG = 0x0;
[DllImport("ole32.dll")]
private static extern int CreateBindCtx(int reserved,
out IBindCtx bindCtx);
[DllImport("oleaut32.dll")]
private static extern int RegisterActiveObject
([MarshalAs(UnmanagedType.IUnknown)] object punk,
ref Guid rclsid,
uint dwFlags,
out int pdwRegister);
// register instance so it appears in ROT
private static int Register<T>(T classToRegister)
{
int pdwRegister;
Guid guid = Marshal.GenerateGuidForType(typeof(T));
RegisterActiveObject(classToRegister,
ref guid,
ACTIVEOBJECT_STRONG,
out pdwRegister);
return pdwRegister;
}
// do stuff in VBScript before disposal calls Revoke with the stored
// pdwRegister value from the method above
// revoke instance so it's removed from ROT
private static void Revoke(int pdwRegister)
{
IBindCtx bc;
CreateBindCtx(0, out bc);
IRunningObjectTable rot;
bc.GetRunningObjectTable(out rot);
// EXCEPTION: pdwRegister is *always* 65536, an invalid value!
rot.Revoke(pdwRegister);
}
如果我终止程序并忽略异常,则实例通常会将其自身从 ROT 中删除。然而,一段时间后,我注意到 ROT 中存在应用程序 GUID 的多个实例,并且我的 VBScript 客户端在 GetObject(, "my.id") 上开始失败。有什么想法吗?
第一个注册的始终是 65536,这是正确的。
Use
[DllImport("oleaut32.dll", PreserveSig = false)]
public static extern void RevokeActiveObject(
uint handle,
IntPtr reserved);
And Not:
IBindCtx bc;
CreateBindCtx(0, out bc);
IRunningObjectTable rot;
bc.GetRunningObjectTable(out rot);
// EXCEPTION: pdwRegister is *always* 65536, an invalid value!
rot.Revoke(pdwRegister);
And RevokeActiveObject
需要从注册的同一线程和过程中调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)