Двомовність в народ, Різне, Програмування, статті

Автор: Дмитро Солодкий, Королівство Delphi


У статті описана практика написання проекту на двох мовах: Delphi і С + +. По-перше, навіщо це потрібно? Кожен досить великий проект рано чи пізно приходить до питання розподілу праці. Тобто як можуть кілька людей працювати над одним і тим же проектом. Тут є безліч рішень. Одним з них є концепція Plugins. Даная тема чудово описується в статті Дмитра Полщанова “Ще раз про Plugin” s … “. Але з часом в команді з’являтися люди або завдання, для яких краще б підійшов мову С + +. Про написання плагінів для проекту на Delphi на мові С + + і піде далі мова.


Що б ми хотіли отримати? Є проект написаний на Delphi. Є підсистема плагінсов теж, природно, на Delphi. Завдання полягає в написанні такого ж плагіна, але на С + + Builder.


Єдиною відмінністю між пакетами (bpl), які написані на С + + Builder, і пакетами на Delphi являються 2 речі:



  1. Пакети С + + Builder використовують динамічну бібліотеку С + + і зовнішній менеджер пам’яті (cc32 ** mt.dll, borlndmm.dll). Пакети, написані на Delphi, ці бібліотеки не використовують. Така поведінка лінкера С + + можна відключити в опціях лінкера (Use dynamical RTL). Після відключення такої поведінки пакету більше не потрібен зовнішній менеджер пам’яті borlndmm.dll, а замість нього буде працювати rtl100.bpl.
  2. В С + + Builder немає поняття “модуль”. А значить, у нас не буде секції Initialization. Замість неї можна використовувати або експортуються функції, або функцію DllEntryPoint.

Для того, щоб отримати заголовки класів, які написані на Delphi, потрібно використовувати перемикачі в опціях проекту LinkerLinker outputGenerate all C + + Builder files. Це змусить линкер не тільки створити bpl і dcu файли, але і створити заголовні файли (hpp), файл імпорту (bpi) і статичну бібліотеку (lib). Після таких маніпуляцій у вас буде повний доступ до всіх модулів пакета. Крім того, всі компоненти пакета також з’являться в палітрі компонентів С + + Builder.


Коли Delphi компілює пакет, всі класи і функції, описані в модулях пакета в інтерфейсних секціях, будуть експортованими. Для того щоб клас або функція С + + були експортованими, їх досить описати з макросом PACKAGE.

Interface
Type
TMyClass = class
public
Procedure myProc;
end;
procedure MyGlobalProc;

На С + + цей код буде виглядати так:

class PACKAGE TMyClass : public TObject
{
public :
void __fastcall myProc();
}
void PACKAGE __fastcall MyGlobalProc();

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*