从VBS到WPF通过COM

时间:2013-01-28 14:23:01

标签: wpf com interface vbscript

我们有一个讨厌的(或者可能是一个微不足道的?)问题。

有一个WPF控件。它有2个接口,主要和一个用于自动测试目的。这样定义:

[ComVisible(true)]
[Guid("xxx")]
public interface IXXXXXTest
{
[DispId(1)]
    void Test1(int index);
}

[ComVisible(true)]
public interface IXXXXX
{
    void Main1(index);
}

[ComVisible(true)]
[Guid("xxx")]
ClassInterface(ClassInterfaceType.None)]
public partial class XXXXX_WPF_CONTROL : UserControl,
                         IXXXXX,
                         IXXXXXTest
{
     ...
}

现在我们正试图从VBS到达它。 尝试1)

Set Ctrl = GetControl(...)  <---- this is ok
Ctrl.Test1(0)  <---- Object doesn't support this property or method: 'Ctrl.Test1'

Set Ctrl = GetControl(...)  <---- this is ok
Ctrl.Main1(0)  <---- this is ok

所以它适用于&#34; main&#34;接口,但用于测试接口。 这似乎没问题(?),因为据我所知,VBS到达&#34; main&#34;如果没有IDispatchEx,则仅通过IDispatch进行接口。所以我在IXXXXX中添加了一个属性来获取测试界面。

[ComVisible(true)]
public interface IXXXXX
{
    void Main1(index);
    IXXXXXTest Test { get;}
}
....
public IXXXXXTest Test
{
    get {   return this as IXXXXXTest;  }
}

很好,所以现在我可以通过&#34; main&#34;来到达这个IXXXXTest界面。接口。 尝试2)

VBS:

Set Ctrl = GetControl(...)  <---- this is ok
Set CtrlTest = Ctrl.Test  <----- this is ok
CtrlTest.Test1(0)    <---- Object doesn't support this property or method: 'CtrlTest.Test1'

:(

请注意,对于我们的其他.NET控件,&#34; Try1&#34;工作,没有任何技巧!

那么可能是因为WPF有些不同? 另外,改变

ClassInterface(ClassInterfaceType.None)]

进入其他任何东西(AutoDispatch / AutoDual),或者让它停止使WPF控件无法使用。

除此之外,本文也应如此:Is it possible to package WPF window as COM Object

你知道这可能是什么问题吗? 非常感谢!

1 个答案:

答案 0 :(得分:1)

脚本语言只能使用类的默认接口。你有不止一个,所以至少其中一个不可用。如果方法名称与其他声明冲突,则可以重命名方法名称。我假设你在你的问题中混淆了真实姓名,因此很难诊断你发布的这种重命名。

最好的办法是在接口类型上临时应用[InterfaceType(ComInterfaceType.InterfaceIsDual)]属性。这允许您使用Tlbexp.exe生成类型库,然后可以使用OleView.exe实用程序File + View Typelib命令查看该类型库。您将看到方法的确切名称,您将看到哪个接口是coclass上的[default]接口。从那里你可以轻松修改你的声明,这样它们就可以用脚本语言工作。