kiber_punk писал(а):Хочу поинтересоваться, как же пишутся tlb,
Открывается блокнот (нет подсветки синтаксиса) или MSVC6 (есть подсветка синтаксиса), или какой-то другой редактор, и пишутся.
в частности для WinAPI?
Так же, как и вообще (см. выше).
С IDL'ом почти не работал. А ещё и Vtbl нужно организовывать...В общем тёмный лес.
При написалии TLB-шки Vtable не нужно организовывать. Ни вообще, ни при написании TLB-шки с описанием WinAPI-функий в частности. При написании TLB-шки, которая описывает WinAPI-функции, описывается один или несколько
модулей, в каждом модуле описываются интересующие
функции. Для каждого модуля в исходнике должна быть указана dll-библиотека, экспортирующая функции. Для каждой функции в модуле может быть указано имя функции в том виде, в котором она экспортируется, исходя из того, что экспортное имя может отличаться от имени, присвоенного функции автором TLB-шки.
И примеров негде не видно.
Враньё. Примеров более чем очень много. Даже в моей статье в википедии есть
пример. Там же есть и пример объявления
Но главный вопрос который меня терзает - можно ли реализовать это через IDispatch и прикрутить идентификаторы (ProgID/CLSID)?
А вот это конкретная чушь.
«Мне нужно разбить газон. Можно ли это реализовать через дверной проём и прикрутить РНН».
Функции, экспортируемые библиотеками, описываются как члены
модулей. Модули — это одно.
IDispatch — это один из интерфейсов, уже придуманый кое-кем и с определённым смыслом и предназначением. Интерфейсы — это совершенно другое. Они не имеют никакого отношения к модулям и их членам.
CLSID это идентификатор
класса. Класс — это вообще третье. Класс это не модуль. Класс это не интерфейс. Модуль это не интерфейс.
Класс, интерфейс, модуль — три разных понятия.
Функции из экспортируемых библиотек имеют отношения только к модулям.
Vtable-ы имеет отношение только к интерфейсам.
CLSID-ы имет отношения только к классам.
ProgId это человеко-понятный идентификатор, аналогичный по функциональности СLSID-у.
У любого COM-класса есть CLSID, один и только один.
У любого COM-класса может быть ProgId, а может и не быть его.
COM-класс позволяет плодить сколько угодно COM-объектов — экземпляров этого класса.
Понятие COM-объекта не определено как-либо, кроме как
нечто, у чего наличествует один или более COM-интерфейс.
Общения с COM-объектом никогда не бывает, бывает только общение с COM-интерфейсом.
Не существует способа по COM-интерфейсу определить COM-объект, которому принедлежит интерфейс, хотя бы потому, что сущность объекта нигде не определена, определена только сущность интерфейса.
У СOM-объекта может сколько угодно COM-интерфейсов, но должен быть как минимум один (IUnknown).
Не существует какого-либо способа определить, что два разных COM-интерфейса относятся к одному COM-объекту, кроме как запрос у обоих интерфейсов интерфейса IUnknown и сравнения значений интерфейсных-указателей. Если два разных интерфейса вернули одинаковый указатель на IUnknown, то эти два интерфейса принадлежат одному объекту.
Не любой COM-объект является экземпляром какого-либо COM-класса. То есть не для любого COM-объекта обязательно нашёлся бы соответствующий COM-класс, некоторые объекты родились на свет способом, отличным от порождения экземпляра класса. Это важно, многие не понимают этого.
Поскольку в общем случае COM-объект не обязан быть экземпляром какого-то COM-класса, не существует общего способа для любого объекта установить информацию о классе объекта. Для объектов, которые являются экземплярами какого-то класса, возможно получить такую информацию, если объекты поддерживают интерфейс IProvideClassInfo, наряду с др. интерфейсами.
Модули, в которых описаны функции, экспортируемые dll-библиотеками, не имеют никакого отношения ни к классам, ни к интерфейсам. Модули — они сами по себе. У них нет и не может быть ни Vtable, ни IID-а, ни CLSID-а, ни ProgId-а.
Идентификатор интерфейса называется IID-ом.
Идентификатор класса называется CLSID-ом. Текстовый идентификатор класса называется ProgId-ом. Он, если и бывает, то только у классов (никогда не бывает у интерфейсов).
Может быть 5 объектов разных классов, поддерживающие каждый одинакоывй набор из 29 интерфейсов.
Описание интерфейса в TLB сводится к описанию IID-а интерфейса и описания всех его членов.
Описание класса в TLB сводится к описанию CLSID-а класса и описанию одного или нескольких интерфейсов, которые будут поддерживаться любым экземпляром данного класса.
Реализация интерфейсов объекта, реализация класса (включая создание нового экземпляра класса) не имеет никакого отношения к TLB.
Два объекта, поддерживающих один и тот же интерфейс (в числе прочих интерфейсов) могут иметь совершенно разную реализацию этого интерфейса.
Два объекта, являющихся объектами одного класса, обязаны иметь одинаковую реализацию всех интерфейсов.
Если у класса меняется что-либо (поведение одного из методов любого из интерфейсов, или набор интерфейсов), изменённый класс обязан иметь новый CLSID.
Если у интерфейса меняется что-либо, интерфейс обязан получить новый IID.
IID является своего рода слепком, хешем и контрольной суммой от всех значащих параметров интерфейса (набор членов, набор параметров каждого из членов).
CLSID является своего рода слепком, хешем и контрольной суммы всей совокупности поведения, присущего классу.
Имена классов и интерфейсов могут быть разными для принципиально одного класса, или одинаковыми для принципиально разных классов, и интересны лишь для средств разработки.
IID-ы и CLSID-ы должны быть уникальными и служить тому, что описано выше.
У моделей есть свой уникальный идентификатор, который не имеет своего самостоятельного названия.
Нельзя запросить у кого-либо создание интерфейса, указав IID.
Нельзя запросить у кого-либо создание класса, указав CLSID/ProgId.
Нельзя запросить у кого-либо создание модуля, указав UUID модуля.
Можно запросить у кого-либо интерфейс, указав IID. Поскольку любой COM-интерфейс унаследован от интерфейса IUnknown, любой интерфейс имеет метод QueryInterface, поэтоу у любого интерфейса можно запросить любой другой интерфейс.
Можно запросить у кого-либо создание экземпляра класса, указав CLSID или ProgId. Возвращается при этом не ссылка на объект, а ссылка на интерфейс объекта.
Можно запросить у кого-либо создание нового объекта или возврат ссылки на какой-либо интерфейс уже существующего объекта.