Здравствуйте tamtam, Вы писали:
T>Очень часто видел такие медоды, например в ADO T>А как самому такие сделать в COM что-то не догоняю... T>Помогите.
Если параметр имеет тип VARIANT, то помечаешь его атрибутом optional.
Если другой, помечаешь его атрибутом defaultvalue(Значение). Где "Значение" — это значение которое будет подставляться по умолчанию.
При этом есть два ограничения. Не обязательные параметры дожны идти в конце (т.е. с правой стороны) списка параметров (но перед [out, retval]).
Значения по умолчанию будут доступны только в высокоуровневых языках/визуальных средах (типа VB). В VC можно воспользоваться директивой #import, которая (по умолчанию) создает обертки над COM-интерфейсами обеспечивающие такую функциональность.
Вот пример idl-я:
HRESULT SomeMethod([in], NormalParam, [in, optional] VARIANT OptionalParam, [in, defaultvalue(-1)] long DefValParam, [out, retval] long *pRet);
PS
На этот вопрос сдесь отвечали уже много раз. На будущее советую сначала воспользоваться поиском.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как создавать методы с необязательными параметрами
Спасибо за ответ.
Я именно так и делаю, но при вызове из VBS или JS идет ошибка — неверное кол-во параметров или их типы.
ВОт сижу и думаю, что сделал неправильно...
Но всеравно спасибо. Кстати, как искоть в этом форуме? Не догоняю...
Re[3]: Как создавать методы с необязательными параметрами
Здравствуйте tamtam, Вы писали:
T>Здравствуйте VladD2.
T>Спасибо за ответ. T>Я именно так и делаю, но при вызове из VBS или JS идет ошибка — неверное кол-во параметров или их типы.
Объявляй параметры методов как VARIANT, тогда пробем со скриптами будет меньше.
T>Но всеравно спасибо. Кстати, как искоть в этом форуме? Не догоняю...
Дык на любой (если ты конечно не лазиешь напрямую в форумы) странице в шапке есть кнопка.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Как создавать методы с необязательными параметрами
1. Найди длл (или ехе), в который линкуется, проверь tlb в этом исполняемом, что там есть такое же объявление,
2. Проверь, что зарегистрировано в качестве tlb для твоего интерфейса, тот ди файд, что линкуется.
Могут быть глюки с невозможностью перевисать исполняемый файл (залочен) и тем, что компонент не регистрирует новый интерфейс из-за программной ощибки,
Здравствуйте VladD2, Вы писали:
VD>Если параметр имеет тип VARIANT, то помечаешь его атрибутом optional. VD>Если другой, помечаешь его атрибутом defaultvalue(Значение). Где "Значение" — это значение которое будет подставляться по умолчанию.
optional не применяется к параметрам, не имеющим тип VARIANT или VARIANT*. Однако defaultvalue(Значение) применяется к любым, даже и имеющим тип VARIANT.
Здравствуйте tamtam, Вы писали:
T>Все проверил, все нормально. в ТЛБешке все как надо T> HRESULT Method([in, optional] VARIANT p1, [in, optional] VARIANT p2);
T>сам теряюсь в догадках
Не мог бы ты показать как у тебя реализуются IDispatch функции — GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, Invoke? И что такое __interface? И что такое MyInterface?
Здравствуйте Vi2, Вы писали:
Vi2>optional не применяется к параметрам, не имеющим тип VARIANT или VARIANT*. Однако defaultvalue(Значение) применяется к любым, даже и имеющим тип VARIANT.
А ты попробуй.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте VladD2, Вы писали:
Vi2>>optional не применяется к параметрам, не имеющим тип VARIANT или VARIANT*. Однако defaultvalue(Значение) применяется к любым, даже и имеющим тип VARIANT.
VD>А ты попробуй.
Да... Сморозил глупость. Не даёт MIDL задать defaultvalue для VARIANT.
Здравствуйте Vi2, Вы писали:
Vi2>Не мог бы ты показать как у тебя реализуются IDispatch функции — GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, Invoke? И что такое __interface? И что такое MyInterface?
Пишу я на VS.NET (ATL 7.0)
И все это генерируется автоматически.
Прошагал вызов в отладчике на Invoke и нашел там код который жестко проверяет кол-во параметров независимо от того, optional они или defaultvalue.
как заставить нормальный код генерировать мне непонятно.
вот что лежит в MyInterface.H файле
// IMyInterface
[
object,
uuid("9E3B7F38-3953-4AA8-AA8C-B51084DAC59B"),
dual, helpstring("IMyInterface Interface"),
pointer_default(unique)
]
__interface IMyInterface : IDispatch
{
[id(1), helpstring("method Method1")] HRESULT Method1([in] VARIANT p1, [in, optional] VARIANT p2, [out,retval] LONG* p3);
[id(2), helpstring("method Method2")] HRESULT Method2([in, defaultvalue(0)] LONG p1);
};
Здравствуйте tamtam, Вы писали:
T>Все проверил, все нормально. в ТЛБешке все как надо T> HRESULT Method([in, optional] VARIANT p1, [in, optional] VARIANT p2);
T>сам теряюсь в догадках
Что проверил? Что нормальн? Ты вот так попробуй:
HRESULT Method([in, defaultvalue("Вот такой вот дефолт!")] VARIANT p1, [in, defaultvalue(-21)] VARIANT p2);
А то, что optional для вариантов подходит, ... кто бы спорил.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Я при создании ATL проекта в VS.NET выбрал галочку "Atributed" если ее не ставить, все поулчается нормально. Пошел разбираться, что за атрибутед такие.