Это не так сложно сделать без мастера.Я узнал, что добавлять методы интерфейса COM сложно, потому что мне было лень искать его в MSDN , поэтому я внимательно посмотрел на другие интерфейсы COM и экспериментировал, добавляя свойства, методы и т. Д.
Прежде всего, есть два недостатка при использовании мастера, особенно при редактировании существующих интерфейсов COM.Сначала это медленно, особенно если у вас большой компонент с десятками интерфейсов.Я сижу перед вполне приличной рабочей станцией и открываю мастер, а выполнение двух или трех шагов занимает больше времени, чем ручное добавление метода в файл IDL, .h и .cpp.
Вторым является то, что при использовании разных Visual Studio и, следовательно, разных версий Мастера, будет создаваться грязь c ++, например, несколько публичных операторов без какой-либо необходимости и тому подобного.Однако я рекомендую вам действовать как мастер, чтобы не перепутать его, если следующий программист снова использует этот мастер - что увеличит путаницу и в конечном итоге приведет к увеличению размеров файлов, нечитаемым объявлениям классов и увеличению времени компиляции.Просто вставьте методы и макросы того же типа в то же место, что и мастер.
Так что, может быть, вам покажется полезным то, что я обнаружил так долго.Вы можете найти гораздо больше подробностей в статье " Понимание IDL ", которая довольно старая, но предоставляет основные основы, которые я не буду здесь упоминать.
Файл IDL содержит все определения интерфейсаВаш компонент будет экспортироваться.Поэтому, если вы хотите добавить метод, вам нужно найти соответствующее определение интерфейса, которое вводится ключевым словом "interface" и именем, которое обычно начинается с заглавной буквы I. Интерфейсу предшествуют некоторые аннотации, окруженные [и], которые яне буду объяснять ради простоты.При использовании Visual Studio ключевые слова IDL будут выделены правильно.Вот как может выглядеть типичный интерфейс:
[
object,
uuid(0B2499FA-0D73-488C-B961-03FB8327485C),
dual, helpstring("IMyInterface Interface"),
pointer_default(unique)
]
interface IMyInterface : IDispatch {
// ... methods and properties
};
Теперь давайте предположим, что IMyInterface содержит только один метод, и вы хотите добавить аналогичный второй:
[id(1), EXCLUDE_FROM_HELP] HRESULT DoSomething([in] long newVal, [out, retval] long* pRetVal);
Снова таманнотации в скобках [].При добавлении нового метода увеличьте значение аннотации id.Также перед параметрами укажите аннотацию [in] для входных параметров, [out] для параметров, которые будут содержать результаты методов.Если есть только один результат, вы можете использовать метод, который использует результат в качестве возвращаемого значения.Затем используйте аннотацию [out, retval].
Поэтому при добавлении такого метода скопируйте строку выше, увеличьте ID и измените имя метода и соответственно измените параметры.
Обратите внимание, что[out] параметры всегда должны быть указателем.Для этого есть несколько причин, наиболее очевидной из которых является то, что [in, out] также возможен, поэтому результат для параметра должен быть записан в тот же адрес памяти внутри компонента, чтобы его можно было передать вызывающей стороне.без труда.Также обратите внимание, что «реальное» возвращаемое значение должно быть дескриптором HRESULT, который будет указывать на успех или неудачу метода.
Теперь давайте посмотрим в заголовок C ++.Я предполагаю, что вы найдете правильный файл и разместите его самостоятельно.
STDMETHOD(DoSomething)(/*[in]*/ long newVal, /*[out, retval]*/ long* pRetVal);
Макрос STDMETHOD заботится о значении результата, которое является HRESULT, и типе вызова.Аннотации здесь не действительны, но для пояснения предполагаемого использования в файле IDL они добавляются как комментарии.Эти комментарии не являются обязательными.Будьте осторожны, используя те же типы данных, что и внутри файла IDL.
STDMETHODIMP CMyClass::DoSomething( /*[in]*/ long newVal, /*[out, retval]*/ long* pRetVal )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
long result = GetTheResultValueFromSomewhere();
*pRetVal = result;
return S_OK;
}
STDMETHODIMP - это другой макрос, чем в заголовке.В основном это делает то же самое, хотя.Важным является макрос AFX_MANAGE_STATE, если вы хотите использовать ресурсы, например, в диалоге MFC.Представьте, что значение в приведенном выше примере определяется запросом пользователя.Читайте об этом в блоге Technical Tips .
Понимание механизмов IDL поможет вам, как только возникнут ошибки, которые не обязательно относятся к проблеме в вашей логике, а к интерфейсу. Это также позволит вам понять, что на самом деле делает интерфейс, что поможет вам избежать ошибок при использовании мастера, поэтому я рекомендую всем прочитать хотя бы некоторую основную информацию о нем.