Я унаследовал проект, который включает в себя COM DLL. Я новичок в COM, но что-то не так. Интерфейс, определенный в IDL, использует только VARIANT
тип для всех свойств и возвращаемых методов / параметров. Есть ли возможное оправдание этому? У меня такое чувство, что предыдущий разработчик просто кое-что делал, но хочу быть уверенным.
Вот как выглядит мой IDL:
interface IMyComInterface : IDispatch
{
[id(1), helpstring("method CheckMessage")] HRESULT CheckMessage([in] VARIANT vMsg);
[id(2), helpstring("method CheckFolder")] HRESULT CheckFolder([in] VARIANT Folder, [out] VARIANT *pCount, [out, retval] VARIANT *pErrorCount);
[propget, id(3), helpstring("property Flags")] HRESULT Flags([out, retval] VARIANT *pVal);
[propput, id(3), helpstring("property Flags")] HRESULT Flags([in] VARIANT newVal);
[propget, id(4), helpstring("property MessageStore")] HRESULT MessageStore([out, retval] VARIANT *pVal);
[propput, id(4), helpstring("property MessageStore")] HRESULT MessageStore([in] VARIANT newVal);
[propget, id(5), helpstring("property Directory")] HRESULT Directory([out, retval] VARIANT *pVal);
[propput, id(5), helpstring("property Directory")] HRESULT Directory([in] VARIANT newVal);
[propget, id(6), helpstring("property MessageCount")] HRESULT MessageCount([out, retval] VARIANT *pVal);
};
Большое спасибо.
РЕДАКТИРОВАТЬ:
Чтобы было понятно, все эти VARIANT
s можно заменить явными типами.
Если вам нужна производительность или упрощение, вы меняете тип VARIANT для соответствующих значений, более близко к используемому типу. Помните, это разрыв интерфейса.
Просмотр допустимых значений для использования:
Типы данных COM
Ваш интерфейс происходит от IDispatch
Это означает, что это двойной интерфейс — вы можете вызывать методы непосредственно из интерфейса или вызывать их через iDispatch::Invoke
. Параметры, переданные в Invoke
все должны быть типа VARIANTARG
это просто другое название VARIANT
, увидеть http://msdn.microsoft.com/en-us/library/ms891678.aspx.
Для определенных типов двойных интерфейсов, которые предполагают работать с VB
и скриптовые языки лучше использовать VARIANT
это прямой тип. Например, лучше использовать VARIANT
в течение почти всех видов SAFEARRAY
и указатели интерфейса. Но вы можете проверить и увидеть.