У меня есть надстройка Visual Studio, которая содержит механизм сценариев, реализованный на C++. Надстройка может взаимодействовать только с Visual Studio с использованием интерфейсов IDispatch
. Я нахожусь в процессе модернизации его из VS 2005 в VS 2010.IDispatch возвращает DISP_E_UNKNOWNNAME для CommandBarButton.Style
надстройка делает серию IDispatch::Invoke()
вызовов эквивалентно следующему Visual Basic:
control = commandBar.Controls.Add(MsoControlType.msoControlButton)
control.Caption = "My button"
control.FaceId = 59
В VS 2005, это используется работать. Но в VS 2010 это не так. GetIDsOfNames()
DISP_E_UNKNOWNNAME
для "FaceId".
Обратите внимание, что «Caption» (который успешно завершен) является свойством CommandBarControl
, а «FaceId» (который не работает) является свойством подкласса CommandBarButton
. Имя класса для кнопки IDispatch*
: CommandBarControl
. Поэтому я думаю, что мне нужно как-то понизить CommandBarControl IDispatch*
до CommandBarButton IDispatch*
.
В Visual Basic я мог бы написать:
button = DirectCast(control, CommandBarButton)
button.FaceId = 59
Но я не знаю, что делает DirectCast()
внутренне. Если бы я это сделал, я, вероятно, был бы близок к решению этого.
Благодаря
радостях нескольких интерфейсов диспетчерских –
Благодаря Matt ... Несколько интерфейсов IDispatch, на самом деле ?? Разве это не означает, что MS нарушает свои собственные правила, что объект может иметь только один интерфейс IDispatch? Мое понимание: «разрешено только одно IDispatch (использование QueryInterface с IDispatch всегда должно возвращать тот же интерфейс)» (http://www.codeguru.com/cpp/com-tech/atl/atl/article.php/ c47/Multiple-Dispatch-Interfaces-in-ATL.htm) – Chungzuwalla
Разрешено несколько интерфейсов отправки, но некоторые языки не могут получить к ним доступ. Вот почему иногда советуют не использовать несколько двойных интерфейсов.В C++, например, вы указываете IID с запросом интерфейса, поэтому вы можете иметь IDispatch *, но вы можете запросить 'IID_IFoo'. Если у объекта есть 'IFoo' как двойной интерфейс, то это работает. –