Створення DLL з Web-ресурсами
У доданих до статті архівах міститься весь описаний в ній інструментарій та приклад готової DataBank.dll.
Архів Initial.zip містить проміжний об'єктний файл DataBank.obj майбутньої бібліотеки, файл сценарію ресурсів DataBank.rc і компільований з нього двійковий файл ресурсів DataBank.res. Крім того, в даний архів включені файли, безпосередньо поміщаються в якості ресурсів в бібліотеку: Header.gif. Return.gif. Back.jpg. Index.htm. Mainpage.htm. Page.htm і Top.htm.
Архів Tools.zip містить весь інструментарій, необхідний для компіляції і компонування бібліотеки DLL. У нього входять компілятор ресурсів BRCC32.EXE. линкер ILINK32.EXE. необхідні для їх коректної роботи файли UUID.LIB. LNKDFM60.DLL. RLINK32.DLL. RW32CORE.DLL. а також пакетний файл BuildAll.bat. містить командні рядки для роботи з компілятором ресурсів і лінкером. Даний інструментарій в обов'язково повинен входити в поставки Borland C ++ Builder і Borland Delphi будь-яких версій, але, можливо, з іменами, відмінними від імен додаються в архівах файлів.
Архів DllSymChanger.zip містить створену мною програму DllSymChanger.exe. полегшує процес заміни символів, необхідний для функціонування бібліотеки DLL.
Вміст архівів автономно від наявності або відсутності на комп'ютері користувача встановлених версій BCB і Delphi, його робота перевірена на машині з абсолютно "свіжої" Windows 98 SE.
Згадавши класичне (НЕ-RAD) програмування з властивим йому "ручним" створенням файлу сценарію ресурсів, приходимо до висновку, що це - саме те, що нам потрібно. Іншими словами, нас цікавить можливість створення деякої DLL, в складі якої знаходилися б ресурси з необхідними нам, в кінцевому рахунку, HTM-сторінками.
На наступному етапі нам необхідно отримати компілює файл ресурсів, які будуть включені в нашу DLL. Для цього необхідні безпосередньо самі ресурси (HTM-сторінки) і файл сценарію ресурсів (в нашому випадку він носить ім'я DataBank.rc).
У доданому архіві Initial.zip у вигляді прикладу розглянуто створення DLL з розміщеними всередині пов'язаними Web-сторінками. Файли, що представляють ці сторінки, носять такі імена: Index.htm. Mainpage.htm. Page.htm. Top.htm. Header.gif. Return.gif. Back.jpg. Далі йдуть три необхідних вимоги, що пред'являються для правильного функціонування IE всередині створюваної DLL:- Всі файли, які беруть участь в роботі Web-сторінок повинні знаходитися в одній директорії;
- Всі номери в Web-сторінках повинні бути відносними;
- Ім'я жодного з файлів, які використовуються в Web-сторінках, не повинно містити символів підкреслення. Імена файлів повинні складатися з набору символів AвЂ|Z і 0вЂ|9. Імена файлів не повинні починатися з цифр.
Недотримання третьої вимоги у галузі використання символу підкреслення не є критичним і буде розглянуто нижче. Решта ж частини третьої вимоги повинні дотримуватися. Пов'язано це з тим, що імена ресурсів при компіляції RES-файлу повинні підкорятися правилам завдання ідентифікаторів мови C, порушення яких призводить до помилок в процесі компіляції файлу сценарію ресурсів в двійковий файл ресурсів.
Expecting resource name or resource type name
Для вирішення даної проблеми, замість точки, що розділяє "ім'я" ресурсу і його "розширення", ми використовуємо символ підкреслення - єдиний символ, який не є цифрою або латинською буквою і дозволений при створенні імені ресурсу. Як неважко здогадатися, кінцевий файл DLL буде містити ресурси з іменами, розділеними символом підкреслення, який, для працездатності DLL доведеться замінювати точкою. Але про це - пізніше.
Другим елементом рядка опису ресурсу є ім'я типу ресурсу. Якщо ми будемо застосовувати для призначення наших ресурсів зумовлений довільний тип RCDATA. компіляція та збирання DLL пройдуть, ресурси буде коректно викликатися з бібліотеки будь-якими прикладними програмами як ресурси, але IE відмовиться обробляти їх таким чином, як нам необхідно. Точно те ж саме станеться, якщо ми дамо ресурсів сторінок будь-який інший довільний тип. Тобто, у мене існувала певна надія, що IE буде розглядати типи згрупованих ресурсів як своєрідні піддиректорії, що було б зовсім непогано для систематизації ієрархії взаємозв'язків між логічними групами сторінок, але розробники IE, мабуть, дотримуються іншої думки на цей рахунок. Таким чином, якщо ми дамо типу ресурсу ім'я, наприклад, PAGEAREA або будь-яке інше, включаючи і RCDATA, після завершальної обробки бібліотеки IE все одно відмовиться сприймати Web-сторінки у вигляді Web-сторінок. Рішення в цій тупиковій ситуації підказує вивчення структури системою бібліотеки shdoclc.dll. Всі сторінки, розташовані в його ресурсах, належать двом типам, імена яких не є строковими, а цілочисельними ідентифікаторами. Для завдання цілочисельних типів ресурсів, в рядку файлу сценарію ресурсів необхідно цілочисельні значення ідентифікаторів укласти в круглі дужки. В іншому випадку, компілятор ресурсів сприйме їх як строкові ідентифікатори.
Третім елементом рядка опису ресурсу є ім'я файлу сторінки. Воно може бути зазначено просто у вигляді підрядка, або укладено в подвійні лапки. Зайве говорити, що всі використовувані в створенні DLL файли при такому способі роботи повинні знаходитися в одній директорії диска. Це стосується як усіх службових файлів проекту, так і всіх файлів, які розміщені в ресурси.
В кінцевому вигляді рядок, що описує приєднання сторінки index.htm до ресурсів майбутньої бібліотеки, виглядає так:
index_htm (23) index.htm
Після того, як створений файл сценарію ресурсів, необхідно провести його компіляцію. Для цього скористаємося компілятором ресурсів командного рядка BRCC32.EXE. що входять до складу BCB6. Поглянувши на назву файлу компілятора, бачимо, що результатом його роботи стане 32-розрядний двійковий файл ресурсів (принаймні, якщо не використовувати додаткових опцій командного рядка). Теоретично, можна скористатися різними 16-розрядними компиляторами (RC.EXE. BRCC.EXE і т.п.) і ми досягнемо наміченого результату, але, так як далі нами буде використовуватися 32-розрядний линкер, рекомендую користуватися саме 32-розрядних компілятором ресурсів . Запуск компілятора ресурсів проводиться з командного рядка, яка включає в себе безпосередньо ім'я файлу компілятора ресурсів та ім'я файлу сценарію ресурсів:
Наступним кроком у створенні DLL є збірка бібліотеки з об'єктного файлу DataBank.obj і виконуваного файлу ресурсів DataBank.res. Для цієї мети скористаємося лінкером ILINK32.EXE. викликає в свою чергу бібліотеки RLINK32.DLL і LNKDFM60.DLL і використовує файл UUID.LIB. Командний рядок виклику линкера з параметрами виглядає наступним чином:
ilink32 DataBank.obj, DataBank.dll. DataBank.res
Warning: Image linked as an executable, but with a .DLL or .BPL extension
Це пов'язано з відсутністю DEF-файлу, але, тим не менш, на коректність вмісту бібліотеки не впливає. У процесі складання лінкером будуть створені файли з ім'ям результуючого модуля і розширеннями TDS, MAP, ILC, ILD, ILF, ILS які можна безболісно видалити.
Бібліотека з ресурсами Web-елементів створена.
Якби ми скористалися 16-розрядних лінкером (наприклад, LINK.EXE), то в результаті ми отримали б коректну 16-розрядну DLL, але IE відмовився б працювати з нею, видавши відповідне повідомлення.
Припустимо, що DataBank.dll має наступний шлях:
Якщо ми запустимо IE і в рядку URL введемо
Internet Explorer знайде ресурс INDEX_HTM розташований в DataBank.dll. але не зможе правильно визначити очікуваних від нього дій, оскільки ім'я ідентифікатора ресурсу сприймається IE як ім'я файлу без розширення.
Тепер залишилося запустити IE і в рядку URL ввести
Основне завдання виконано повністю.
Варто зауважити, що при виконанні посилань усередині бібліотеки, IE діє як при виконанні посилань в директорії диска.
Даний запропонований мною спосіб, відкриває великі можливості для програмістів у використанні компонента TCppWebBrowser (TWebBrowser) укупі з достатньою захищеністю службових даних програмного продукту.