Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.146.105.194] |
|
Сообщ.
#1
,
|
|
|
Нужна информация по использованию COM на чистом Си, не С++. Вобщем, суть в следующем. Т.к. я в технологии COM начинающий, просьба больно не бить. Имеется длл-ка, представляющая собой COM-объект (или как он там называется). Также имеется полное описание всех методов и атрибутов этой длл-ки. Мне нужно работать с ней на чистом Си, НЕ С++, т.е. работать через Win32 API. Я упорно повторяю НЕ С++, потому что уже в двух форумах мне присылают решения на С++, которые совершенно бесполезны в данной ситуации. Как это сделать? Если кто-нибудь поможет, буду очень благодарен.
|
Сообщ.
#2
,
|
|
|
А idl или tlb файл к этой dll-ке есть? Обрабатываешь его midl'ом (midl.exe - входит в поставку студии). В сгенерированном h-файле будут как C++, так и С интерфейсы. Основному COM-овскому WinAPI побарабану какой указатель ему подсовывают, по этому спокойно объявляешь нужные тебе структуры, суешь указатели на них в API-функции и все должно работать.
|
Сообщ.
#3
,
|
|
|
Читай серию статей (я извиняюсь за название, не я придумал) "OLE for Idiots" в MSDN.
http://msdn.microsoft.com/library/en-us/dn.../msdn_ole2a.asp http://msdn.microsoft.com/library/en-us/dn.../msdn_ole2b.asp http://msdn.microsoft.com/library/en-us/dn.../msdn_ole2c.asp http://msdn.microsoft.com/library/en-us/dn.../msdn_ole2d.asp |
Сообщ.
#4
,
|
|
|
Сообщ.
#5
,
|
|
|
bizar, в данном случае COM - это не COM-порт, а Component Object Model - методика взаимодействия программных компонентов.
|
Сообщ.
#6
,
|
|
|
А можно ли из tlb как-нибудь получить заголовочный файл? Или это только из idl?
И еще: как по ProgID вычислить CLSID? |
Сообщ.
#7
,
|
|
|
Возвращаясь к моему первому сообщению....
Из той длл-ки я выдрал tlb-файл, как оказалось он был в ней в ресурсах. Как его распотрошить, чтобы получить idl? Или как-то можно по-другому вызывать методы? Еще вопрос по функции CoCreateInstance. Конкретно интересуют два параметра. 1) REFCLSID rclsid - это как я понимаю CLSID объекта в целом. 2) REFIID riid - идентификатор интерфейса (???). Так вот, CLSID объекта я получил через CLSIDFromProgId (ProgId известен). Но как получить идентификатор интерфейса? В MSDN ничего подходящего не нашел. З.Ы. Статью Ole for idiots прочитал, но там большей частью про то, как создавать COM-объекты (сервер), а не как с ними работать из клиента. |
Сообщ.
#8
,
|
|
|
ну - можно через import, можно tlb-ку расковырять через OleView...
есть еще способы... |
Сообщ.
#9
,
|
|
|
Сообщ.
#10
,
|
|
|
Эта длл-ка вобще-то для 1С. И там с ней работают просто:
Перем = СоздатьОбъект("трам.тарам"); Перем.GetSomething(); Т.е. сама 1С как-то узнает Interface ID и CLSID. Хотя кроме длл-ки никаких файлов больше нет (ни tlb, ни чего-то еще). Я поэтому и спрашиваю, как это можно сделать. |
Сообщ.
#12
,
|
|
|
2 CheshireCat: классная книга, теперь многое понятно. Благодарю.
|
Сообщ.
#13
,
|
|
|
А чем вызванно такое мазохистское желание прогрпммировать обращение к COMпоненту на чистом C? Ведь использование "чистого" Windows API совсем не означает что нужно писать только на C. Что за компилятор ты хоть используеш?
|