我有一个Visual Studio加载项,其中包含一个用C ++实现的脚本引擎。
加载项只能使用IDispatch
接口与Visual Studio通信。
我正在将它从VS 2005升级到VS 2010。
加载项使一系列IDispatch::Invoke()
调用等效于此Visual Basic:
control = commandBar.Controls.Add(MsoControlType.msoControlButton)
control.Caption = "My button"
control.FaceId = 59
在VS 2005中,这曾经发挥作用。但在VS 2010中它并没有。 GetIDsOfNames()
为" FaceId"。
DISP_E_UNKNOWNNAME
请注意"标题" (成功)是CommandBarControl
和" FaceId"的属性。 (失败)是CommandBarButton
子类的属性。按钮' IDispatch*
的类名是CommandBarControl
。所以我想我需要以某种方式将CommandBarControl IDispatch*
转发给CommandBarButton IDispatch*
。
在Visual Basic中我可以写:
button = DirectCast(control, CommandBarButton)
button.FaceId = 59
但我不知道DirectCast()
内部做了什么。如果我这样做,我可能会接近解决这个问题。
由于
答案 0 :(得分:0)
在这里回答我自己的问题...... bleah。
首先,我发现如果我查询IDispatch
ICommandBarButton
,然后查询IDispatch
,我会得到一个不同的IDispatch
(位于不同的地址) ICommandBarButton
属性。这让我知道如何找到脚本给我的一些任意接口名称的IID(在这种情况下,字符串“CommandBarButton”)。
但经过更多实验后,我只能通过查询IDispatch
,然后再次查询IUnknown
来查看IDispatch
到最派生的类。不需要其他IID或诡计。
在我在问题中描述的情况中,返回的第二个IDispatch*
是与第一个不同的地址,并且类型为_CommandBarButton
(请注意下划线),其中原始类型为{{ 1}}。 ICommandBarControl
似乎具有_CommandBarButton
的所有功能。 (见http://technet.microsoft.com/en-us/microsoft.visualstudio.commandbars.commandbarbutton%28v=vs.90%29)
我现在将此代码包含在我的例程中,该例程将IDispatch对象返回给脚本引擎:
CommandBarButton