我们在WPF WebBrowser控件中托管第三方网页。第三方网站使用VBScript GetObject(, "Prog.Id")
调用来访问已经实例化的对象。
我知道这是一个愚蠢的想法,所以请不要回答告诉我。我们需要与此站点集成,他们无法更改其VBScript方法。
使用PInvoke我可以从我的WPF应用程序代码中调用RegisterActiveObject和GetActiveObject。
[DllImport("oleaut32.dll")]
public static extern int RegisterActiveObject([MarshalAs(UnmanagedType.IUnknown)] object punk, ref Guid rclsid, uint dwFlags, out int pdwRegister);
[DllImport("oleaut32.dll", CharSet = CharSet.None, ExactSpelling = false)]
public static extern void GetActiveObject(ref Guid rclsid, IntPtr pvReserved, [MarshalAs(UnmanagedType.IUnknown)] out Object ppunk);
如果我在RegisterActiveObject之后在WPF代码中使用GetObject,我得到之前实例化的版本,但是在WebBrowser控件中运行的VBScript无法看到正在运行的实例
这是使用ROT注册实例的代码
int regResult = RegisterActiveObject(gatewayObject, ref gatewayClsIdGuid, 0, out this.objectRegisterValue);
未看到已注册实例的VBScript GetObject调用是
If (existing = True) Then
MsgBox("Getting not creating")
Set objTest = GetObject(, progId)
Else
Set objTest = CreateObject(progId)
End if
On Error Goto 0
If (objTest Is Nothing) Then
MsgBox("Unable to get object")
Else
MsgBox("Got the object successfully")
End If
为什么GetObject(, progId)
来电回复Nothing
?