Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab3.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
3.22 Mб
Скачать

Создание библиотеки типов

Откройте автоматически созданную с проектом библиотеку типов.

Пока что она пуста

Здесь предполагается, что наше приложение-хост уже зарегистрирован в реестре. Если ещё нет, то запустите его и нажмите на кнопку Register.

Наполним её жизнь.. Перейдём на вкладку Uses, щёлкнем правой кнопкой по свободному полю справа и выберем пункт «Show All Type Libraries».

Появится огромный список зарегистированных tlb-библиотек. Промотайте список в самый низ (нужная нам начинается на ‘Z’) и поставье галочку на ZigzagServer.

Нажмите на Ctrl+S, чтобы сохранить изменения. Да и вообще, почаще пользуйтесь этой комбинацией в билдере, если только вы не установили где-то в опциях автосохранения параноидально маленький интервал времени.

Добавим на сервер новый COM-класс, класс плагина, унаследованный от IPlugin. Он также будет обрабатывать события IZigzagControlEvents. В таких случаях в COM принято говорить, что IZigzagControlEvents будет его source-интерфейсом, интерфейсом-источником.

Выберем в меню файла пункт добавления нового объекта.

В открывшемся диалоговом окне перейдём на вкладку ActiveX и там выберем COM Object.

В открывшемся окне введите имя создаваемого класса – ZigzagPlugin. Выберите поточную модель Apartment. Введите какое-нибудь описание класса.

Удалите из строки с интерфейсом автоматически подставленное значение и нажмите на кнопку List. Подождите некоторое время, пока загрузится список доступных интерфейсов (внизу слева появится надпись «Finished loading interfaces»), упорядочите их по имени, щелкнув по верхнему заголовку таблицы с надписью «Interface». Найдите в списке интерфейс IPlugin из файла ZigzagServer.tlb.

В окне свойств COM-объекта нажимаем OK.

Перейдите снова к редактору библиотеки типов. Там появился наш новый класс. Отредактируем его, изменив его GUID на {9665CD7C-2CF6-4D73-B6C9-1EC865BE0931}. Затем добавим в строку Help String: «Plugin 2 for ZigzagServer».

Нашей следующей задачей будет зарегистрировать эту библиотеку типов в реестре. Это будет не так просто, ведь наверняка наш проект сейчас не соберется. Нажимаем на кнопку обновления, затем сохраняем библиотеку типов, жмём на кнопку регистрации в реестре.

Билдер попробует скомпилировать проект, но ничего не получится. У меня это произошло из-за совпадения имён. Вот что показывает панель ошибок:

Попробуем разобраться в причинах, почему это происходит. До того, как мы добавили плагин всё собиралось хорошо, стало быть ошибка возникла после добавления плагина. Если посмотреть тексты файлов ZigzagPluginImpl, то можно увидеть, что там ничего такого, кроме пустых заготовок под методы и нет. Ошибка кроется не здесь. Когда мы подключали библиотеку типов сервера, билдер автоматически обернул её и создал файл с описанием COM-классов и интерфейсов Давайте взглянем на этот автоматически созданный файл. Откройте директорию проекта и найдите там файл ZigzagServer_TLB.h. Откройте его через Notepad++.

Далее, так как наш сервер использует многие стандартные классы среды фреймворка, то билдер обернул и их, целиком, начиная от простых классов вроде Int32 и Byte, заканчивая разнообразными сложными структрами, списками, аттрибутами и прочим. Результат работы можно увидеть в файле mscorlib_TLB.h. Он довольно объёмный, тоже откройте его в Notepad++.

Итак, о проблеме. Борландский обёртчик (TLBWRTR) создаёт в начале файлов список GUID-ов классов и интерфейсов. Выглядит это вот так:

extern "C" const __declspec(selectany) GUID IID__ExecutionEngineException = {0xCCF0139C, 0x79F7, 0x3D0A,{ 0xAF, 0xFE, 0x2B,0x07, 0x62, 0xC6,0x5B, 0x07} };

extern "C" const __declspec(selectany) GUID IID__MemberAccessException = {0x7EABA4E2, 0x1259, 0x3CF2,{ 0xB0, 0x84, 0x98,0x54, 0x27, 0x8E,0x58, 0x97} };

extern "C" const __declspec(selectany) GUID IID__Activator = {0x03973551, 0x57A1, 0x3900,{ 0xA2, 0xB5, 0x90,0x83, 0xE3, 0xFF,0x29, 0x43} };

extern "C" const __declspec(selectany) GUID CLSID_Activator = {0x9BA4FD4E, 0x2BC2, 0x31A0,{ 0xB7, 0x21, 0xD1,0x7A, 0xBA, 0x5B,0x12, 0xC3} };

extern "C" const __declspec(selectany) GUID IID__AccessViolationException = {0x13EF674A, 0x6327, 0x3CAF,{ 0x87, 0x72, 0xFA,0x03, 0x95, 0x61,0x26, 0x69} };

extern "C" const __declspec(selectany) GUID IID__ApplicationActivator = {0xD1204423, 0x01F0, 0x336A,{ 0x89, 0x11, 0xA7,0xE8, 0xFB, 0xE1,0x85, 0xA3} };

extern "C" const __declspec(selectany) GUID IID__ApplicationException = {0xD81130BF, 0xD627, 0x3B91,{ 0xA7, 0xC7, 0xCE,0xA5, 0x97, 0x09,0x34, 0x64} };

Имена пременных типа GUID генерируются автоматически, притом обёртчик не обрабатывает совпадения имён в различных файлах. То есть может случиться так, что переменная с такими именем у нас уже где-то существует в другом файле, он создаст ещё одну такую же. А так как у нас на сервере есть интерфейс IList и интерфейс с тем же названием есть в mscorlib, то возникает ошибка дупликации идентификатора. Обёртчик взял наш IList, приклеил к нему сзади стандартный префикс обозначения идентификатора интерфейса «IID_», добавил его в один файл. Потом взял фреймворковский IList и сделал с ним то же самое, а потом сохранил в другой файл. Исправим эту ошибку. В файле mscorlib_TLB.h заменим все вхождения строки «IID_IList» на «IID_CLR_IList». Откроем файл в нотпад++, нажмём Ctrl+F, перейдём на вкладку «Заменить», добавим параметры замены, нажмём на кнопку «Заменить все».

Сохраните файл.

Не в коем случае не закрывайте редактор – эти файлы сгенерированны автоматически и борланд возможно попытается изменить их содержимое на изначальное. В этом случае просто сохраните файлы повторно. Только не забывайте, что многие редакторы не записывают файл, если считают, что в них ничего не изменилось с последнего сохранения – добавляйте и тут же удаляйте один символ, а уже потом сохраняйте. Главное: если ваш Notepad++ сообщает вам о том, что файлы изменились и предлагает их перезагрузить – не делайте этого! Иначе вам придется делать все замены снова. Наоборот, это говорит о том, что билдер сгенерил на место правленных вами файлов новые, не исправленные. Когда Notepad++ предлагает перезагрузить, отвечайте Нет и принудительно перезаписывайте из памяти данные файлы.

Установка флага readonly для файлов наверняка не поможет – билдер работает под правами администратора.

Смотрим следующую ошибку:

Двусмысленность между Byte и System::Byte. Неймспейс System – это тоже неймспейс фреймворковский, потому ищем в редакторе поиском по файлу mscorlib_TLB.h вхождения Byte. Находим вот это:

Ясное дело, что в билдере есть свой тип с именем Byte, а тут ему ещё один такой же пытаются объявить. Заменяем таким же образом в том же файле Byte на CLR_Byte. Переходим к следующей ошибке.

Ок, действуем по накатанной схеме и заменяем всё в том же файле «_Module» на «_CLR_Module».

Сохраняем mscorlib_TLB.h. Из редактора переключаетесь обратно в билдер и нажимаете на кнопку Save All.

Сохраняем файл ZigzagPluginImpl.cpp под предлагаемым нам именем.

Собираем проект иии… бинго! Проект построился, хоть и с предупреждениями.

Возвращаемся к библиотеке типов и жмём там на кнопку регистрации в реестре.

Сервер плагина успешно регистрируется в реестре.

При этом билдер почему-то вновь перегенирирует файлы mscorlib_TLB.h и ZigzagServer_TLB.h. Благо они у нас открыты в редакторе и мы принудительно сохраняем их.

Кстати, мне потом ещё пришлось заменить IList на IClrList, елси что. Можете это сделать сразу.

Теперь можно переходить к реализации плагина.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]