Нужен исходник OLE-сервера на C++
От: Аноним  
Дата: 14.06.01 01:54
Оценка:
Кто-нибудь! Киньте пожалуйста линк на пример OLE-сервера.
А то в книгах — куски.. как все это в едино склеить, один БГ знает..
Пожалуйста, помогите!!!
Re: Нужен исходник OLE-сервера на C++
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.06.01 18:32
Оценка:
Здравствуйте Аноним, вы писали:

А>Кто-нибудь! Киньте пожалуйста линк на пример OLE-сервера.

А>А то в книгах — куски.. как все это в едино склеить, один БГ знает..
А>Пожалуйста, помогите!!!

А OLE-сервер — это в смысле COM-сервер или OLE-документ-сервер?
И чем не подходит код генерируемый визардами?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Нужен исходник OLE-сервера на C++
От: Аноним  
Дата: 15.06.01 03:01
Оценка:
Здравствуйте VladD2, вы писали:

VD>Здравствуйте Аноним, вы писали:


А>>Кто-нибудь! Киньте пожалуйста линк на пример OLE-сервера.

А>>А то в книгах — куски.. как все это в едино склеить, один БГ знает..
А>>Пожалуйста, помогите!!!

VD>А OLE-сервер — это в смысле COM-сервер или OLE-документ-сервер?

VD>И чем не подходит код генерируемый визардами?

COM-сервер.
Не подходит потому, что ни одного стандартного COM-интерфейса
я в этом коде не вижу...
Т.е. хочется побольше в этом разобраться.. А трудновато..
Re[3]: Нужен исходник OLE-сервера на C++
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.06.01 20:42
Оценка:
Здравствуйте Аноним, вы писали:

А>Не подходит потому, что ни одного стандартного COM-интерфейса

А>я в этом коде не вижу...
А>Т.е. хочется побольше в этом разобраться.. А трудновато..

А что вы знаете о COM-интерфейсах? Дело в том, что их миллионы, и каждый предназначен для конкретных задач. Причет большинство из этих задач к COM-у имеют отдаленное отношение.

В общем, какие интерфейсы интересуют? А может даже так. Что хочется получить в конце?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Теперь вопрос стоит иначе: передача результатов
От: Utandr Россия http://utandr.livejournal.com/
Дата: 27.06.01 21:47
Оценка:
Здравствуйте VladD2, вы писали:

У меня теперь другой вопрос:
вот написал я COM-сервер, как передать результаты вызова функции.
Нет, когда return (<простой тип>), это понятно.

Но, допустип задача следующая:
Есть COM-сервер на C++, есть функция, котора должна передать целую таблицу даных в качестве результата. Как это сделать?.
Ничем, кроме VB и C++ пользоваться нельзя.

Спасибо за предыдущие ответы, Vlad2! Благодарен.
Re[5]: Теперь вопрос стоит иначе: передача результатов
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.06.01 21:03
Оценка:
Здравствуйте Utandr, вы писали:

U>Здравствуйте VladD2, вы писали:


U> У меня теперь другой вопрос: ...

U> Есть COM-сервер на C++, есть функция, котора должна передать целую таблицу даных в качестве результата. Как это сделать?.
U> Ничем, кроме VB и C++ пользоваться нельзя.

Привет.
Ну, если таблица из БД тогда можно воспользоваться отключенным курсором ADO или нашей новой разработкой – ascDB (её бета будет выложена на нашем сайте в течении двух недель).
Отключенный курсор ADO – это объект ADO-Recordset, у которого (после выполнения запроса) свойство Activeconnection было установлено в NULL (Nothing).

Если речь едет о чистом COM-е то можно воспользоваться или массивом структур, или массивом Variant-ов каждый из которых содержит массивом Variant-ов.

Массив структур красивее и менее расточительно с точки зрения памяти, а массив Variant-ов имеет большую совместимость со старыми версиями Виндузы и несколько проще в реализации.

На VB вообще проблем нет. Надо просто описать структуру в public-модуле (ActiveX-модуле). Далее, создается функция, возвращаемое значение которой описывается как массив этих самых структур:
Type YYY
Fld1 as String
Fld2() as Long
End Typer
function xxx() as YYY

На C++ несколько сложнее... Но, тоже не очень сложно.
В IDL объявляется структура (при этом обязательно используется typedef). Определении typedef задается GUID этой самой структуры.
Далее описывается метод, что-то вроде.

HRESULT xxx([out, retval] SAFEARRAY(YYY) * pRetStructAsSafeArray);

В C++-коде этот метод описывается как:

HRESULT xxx([out, retval] SAFEARRAY ** pRetStructAsSafeArray);

Далее самое сложное... необходимо изучить роботу SAFEARRAY (см. MSDN и мою статью http://www.optim.ru/cs/2000/2/com/com.asp) и ГЛАВНОЕ изучить поддержку структур в SAFEARRAY.

Создать SAFEARRAY-структур можно с помощью функций SafeArrayXxxEx (Точное название не помню (вроде SafeArrayCreateVectorEx и SafeArrayCreateEx)). Главное, надо получить GUID описываемей структуры и...

Для упрощения жизни (в случае использования C++) лучше воспользоваться хэлпером – CascSafeArray, входящим в нашу библиотеку ascLib (http://www.optim.ru/Software/rus/ascLib/ascLib.asp). При этом GUID для структуры лучше объявить при помощи __declspec... для имени этой структуры.
Вот пример описания структуры на C++:
[uuid(3339F275-7D2C-4CB3-88E9-186D2A4D9251), version(1.0)]
typedef struct SimpleFileInfo
{
BSTR bstrFileName;
long Flags;
} SimpleFileInfo;
cpp_quote("struct __declspec(uuid(\"3339F275-7D2C-4CB3-88E9-186D2A4D9251\")) SimpleFileInfo;")

Здесть cpp_quote вставляет declspec в сишный код. Это позволяет использовать конструкцию типа __uuidof(SimpleFileInfo) там где нужен GUID структуры.

Это описание взято из файла http://www.optim.ru/cs/2000/3/marshaling/marsh.asp. Гляньте и его... может чем сгодится?

В уже упоминавшейся статье http://www.optim.ru/cs/2000/2/comvscorba/comvscorba.asp (а вернее в примерах к ней) есть пример динамического создания структур и массивов структур.

Понимаю, что такого ответа будет не достаточно..., но попробуйте... а когда вопросы станут более конкретными, пишите еще... попробую ответить.

PS

Упомянутые мной статьи есть и на рсдн. Так что зайдите в раздел COM на этом сайте и к нам на страничку http://www.optim.ru/cs/Topics/TopicCom.asp и изучите содержимое ;).

Влад.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Теперь вопрос стоит иначе: передача результатов
От: Utandr Россия http://utandr.livejournal.com/
Дата: 01.07.01 22:04
Оценка:
Здравствуйте VladD2, вы писали:

..
достаточно много Вы писали...
За что и спасибо огромное!
Про SAFEARRAY читаю, с курсорами связываться не хочу — (привязка к БД и -> ODBC).
Еще раз спасибо. Очень признателен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.