IDispatch为CommandBarButton.Style返回DISP_E_UNKNOWNNAME

时间:2014-09-22 01:58:07

标签: c++ visual-studio-2010 com ole

我有一个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()内部做了什么。如果我这样做,我可能会接近解决这个问题。

由于

1 个答案:

答案 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