Двуязычие в народ

Источник: delphikingdom
Дмитрий Солодский

Автор: Дмитрий Солодкий, Королевство 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, нужно использовать переключатели в опциях проекта Linker\Linker output\Generate 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();

Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=20505