我正在使用IRunningObjectTable.Register
和IRunningObjectTable.Revoke
,如this教程中所示。我的VBScript客戶端最初調用方法沒有問題,但是當C#COM服務器處置時,我總是收到「值不在預期範圍內」異常。這是由於下面的註釋行:IRunningObjectTable.Register始終將pdwRegister設置爲65536,無效值
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」)上啓動失敗。有什麼想法嗎?
的代碼片段是無望的,沒有註冊電話的標誌。郵政編碼,可以重現該問題。 – 2011-04-01 15:05:28
固定 - 更多詳細信息可以在鏈接的文章 – Pakman 2011-04-01 15:40:51
中找到呃,調試這個。在RegisterActiveObject調用之後,pdwRegister的值是多少?該值是否存儲在VBScript變量中?這樣做會被破壞嗎?不檢查RegisterActiveObject的返回值是不明智的。 – 2011-04-01 15:54:45