Всем доброго времени суток.
У меня скорее теоретический вопрос, чем практический.
Допустим есть некий COM-компонент реализованный на ATL (если что не так с терминологией поправте плз). Назовём его File. Для него необходимо зоздать несколько методов и свойств. Например
Вопросы:
1) Возможно ли свойство OpenMode сделать перечисляемым типом, что бы можно было использовать константы omRead или omWrite на стороне клиента?
Напрмер написать следующий код в клиентском приложении (код абстрактный)
2) Поскольку любой метод COM-ов должен возвращать HRESULT (по крайней мере визард VS 2003 не позволяет вернуть что-либо другое) вопрос такой. Как сделать возможным написание следующего куска кода
if(file.IsOpen())
{
//...
}
или
LONG res = file.Open("file.txt"); //где res - код ошибки
За примеры буду очень благодарен.
Спасибо всем откликнувшимся.
Удачи.
Species come and go, but the earth stands forever fast...
> 1) Возможно ли свойство OpenMode сделать перечисляемым типом, что бы можно было использовать константы omRead или omWrite на стороне клиента? > Напрмер написать следующий код в клиентском приложении (код абстрактный) >
> 2) Поскольку любой метод COM-ов должен возвращать HRESULT (по крайней мере визард VS 2003 не позволяет вернуть что-либо другое) вопрос такой. Как сделать возможным написание следующего куска кода >
> if(file.IsOpen())
> {
> //...
> }
>
> или >
> LONG res = file.Open("file.txt"); //где res - код ошибки
>
> > За примеры буду очень благодарен. > Спасибо всем откликнувшимся. > Удачи.
Возможно. В реализации метода IsOpen есть 2 подхода. 1 сделат ьсигнатуру метода такой:
HRESULT IsOpen([out, retval] VARIANT_BOOL* pVal);
И возвращать значение соответственно через pVal. Этот способ самый правильный с точки зрения COM. Но есть и другой. Сделать сигнатуру метода такой:
HRESULT IsOpen();
В данном случае надо возвращать ошибочный HRESULT в случае, если файл не открыт. Это более удобно, для C++ клиентов, но менее удобно для скриптов, так как в данном случае ошибочный HRESULT будет исталковын скриптом как исключение, которое надо будет перехватывать. Что касается file.Open(...), либо через out параметр, что более "кошерно", либо через HRESULT, что более удобно для C++. Ещё замечу, что в твоём случае будет удобен макрос HRESULT_FROM_WIN32, для конвертирования win32 ошибок в COM-овские
Здравствуйте, Libra, Вы писали:
L>Всем доброго времени суток. L>У меня скорее теоретический вопрос, чем практический. L>Допустим есть некий COM-компонент реализованный на ATL (если что не так с терминологией поправте плз). Назовём его File. Для него необходимо зоздать несколько методов и свойств. Например L>
L>свойства: L> BSTR FileName L> LONG OpenMode /*omRead, omWrite*/ L>методы: L> Open(BSTR name) L> IsOpen() L>L>Вопросы: L>1) Возможно ли свойство OpenMode сделать перечисляемым типом, что бы можно было использовать константы omRead или omWrite на стороне клиента? L>Напрмер написать следующий код в клиентском приложении (код абстрактный) L>
L>2) Поскольку любой метод COM-ов должен возвращать HRESULT (по крайней мере визард VS 2003 не позволяет вернуть что-либо другое) вопрос такой. Как сделать возможным написание следующего куска кода L>
L> if(file.IsOpen())
L> {
L> //...
L> }
L>
L>или L>
L> LONG res = file.Open("file.txt"); //где res - код ошибки
L>
L>За примеры буду очень благодарен. L>Спасибо всем откликнувшимся. L>Удачи.
предположим что у тебя есть следующая функция в IFile:
HRESULT Open(/*[in]/* BSTR bstrFileName, /*[out]/* LONG * pRetValue);
затем в оболочке для IFile у тебя есть метод:
LONG Open(BSTR bstrFileName)
{
LONG lResult;
IFile->Open(bstrFileName, &lResult);
return lResult;
}
Re[2]: Несколько вопросов про COM и ATL
От:
Аноним
Дата:
07.12.04 11:21
Оценка:
Tom>
Tom>HRESULT IsOpen();
Tom>
Tom>В данном случае надо возвращать ошибочный HRESULT в случае, если файл не открыт. Это более удобно, для C++ клиентов, но менее удобно для скриптов, так как в данном случае ошибочный HRESULT будет исталковын скриптом как исключение, которое надо будет перехватывать.
Можно еще возвращать не ошибочный, а успешный HRESULT, отличный от S_OK, например, S_FALSE. Хотя как этому отнесутся скрипты — не знаю.
L>Вопросы: L>1) Возможно ли свойство OpenMode сделать перечисляемым типом, что бы можно было использовать константы omRead или omWrite на стороне клиента? L>Напрмер написать следующий код в клиентском приложении (код абстрактный) L>
L>2) Поскольку любой метод COM-ов должен возвращать HRESULT (по крайней мере визард VS 2003 не позволяет вернуть что-либо другое) вопрос такой. Как сделать возможным написание следующего куска кода L>
L> if(file.IsOpen())
L> {
L> //...
L> }
L>
L>или L>
L> LONG res = file.Open("file.txt"); //где res - код ошибки
L>
возвращать можно не только HRESULT достаточно вспомнить IUnknown::Addref && Release
они возвращают ULONG.
Спасибо за помощь. Со свойствами и методами разобрался с вашей помощью.
Назрела еще пара вопросов.
1) Что за флаг Attributed, который можно выставить при создания ATL проекта?
2) Законно ли в COM объектах использовать стандартные функции WIN API для создания и управления потоками (такие как CreateThread, TerminateThread и пр.)?
З.Ы.
мой COM-сервер это DLL, флаг Attributed снят.
Species come and go, but the earth stands forever fast...
Здравствуйте, Libra, Вы писали:
L>Спасибо за помощь. Со свойствами и методами разобрался с вашей помощью. L>Назрела еще пара вопросов. L>1) Что за флаг Attributed, который можно выставить при создания ATL проекта?
грубо говоря этот флаг выставляется для того, чтоб меньше лазили в идл коде. особой смысловой нагрузки я не вижу. для примера в ВС6 его просто нет.
L>2) Законно ли в COM объектах использовать стандартные функции WIN API для создания и управления потоками (такие как CreateThread, TerminateThread и пр.)?
запросто. в ком можно использовать даже МФС (если включить мфс суппорт)
L>З.Ы. L>мой COM-сервер это DLL, флаг Attributed снят.
"Libra" <6805@users.rsdn.ru> wrote in message news:935741@news.rsdn.ru... > Спасибо за помощь. Со свойствами и методами разобрался с вашей помощью. > Назрела еще пара вопросов. > 1) Что за флаг Attributed, который можно выставить при создания ATL проекта?
Попытка (провальная) Microsoft-а применить атрибуты для unmanaged (читай не .NET) кода. Использовать НЕ советую. Кстате использовать атрибуты можно и не устанавливая эту птичку. Это можно делать даже для простого консольного проекта.
> 2) Законно ли в COM объектах использовать стандартные функции WIN API для создания и управления потоками (такие как CreateThread, TerminateThread и пр.)?
Законно. Надо только не забыть вызвать CoInitialize[Ex] в потоке. Так же лучше пользоваться __beginthreadex, для инициализации С++ рантайма.
Здравствуйте, Tom, Вы писали:
Tom>Законно. Надо только не забыть вызвать CoInitialize[Ex] в потоке. Так же лучше пользоваться __beginthreadex, для инициализации С++ рантайма.
На сколько я понял из MSDN, вызов функции CoInitialize(NULL) в функции фторичного потока необходим только в том случае если в ней будет использовано что-либо COM-овское.
А если я пишу напрмер вот такой код, нужно ли производит вышеобозначенный вызов?
> 2) Законно ли в COM объектах использовать стандартные функции WIN API для создания и управления потоками (такие как CreateThread, TerminateThread и пр.)?
Законно. Надо только не забыть вызвать CoInitialize[Ex] в потоке. Так же лучше пользоваться __beginthreadex, для инициализации С++ рантайма.
> А если я пишу напрмер вот такой код, нужно ли производит вышеобозначенный вызов?