Дмитрий Солодский
В статье описана практика написание проекта на двух языках: Delphi и С++. Во-первых, зачем это нужно? Каждый достаточно большой проект рано или поздно приходит к вопросу разделения труда. То бишь как могут несколько людей работать над одним и тем же проектом. Здесь есть множество решений. Одним из них есть концепция Plugins. Даная тема прекрасно описывается в статье Дмитрия Полщанова "Еще раз о Plugin's…". Но со временем в команде появляться люди или задачи, для которых лучше бы подошел язык С++. Об написание плагинов для проекта на Delphi на языке С++ и пойдет дальше речь.
Что бы мы хотели получить? Есть проект написанный на Delphi. Есть подсистема плагинсов тоже, естественно, на Delphi. Задача состоит в написании такого же плагина, но на С++ Builder.
Единственным отличием между пакетами (bpl), которые написаны на С++ Builder, и пакетами на Delphi являються 2 вещи:
- Пакеты С++ Builder используют динамическую библиотеку С++ и внешний менеджер памяти (cc32**mt.dll, borlndmm.dll). Пакеты, написанные на Delphi, эти библиотеки не используют. Такое поведение линкера С++ можно отключить в опциях линкера (Use dynamical RTL). После отключения такого поведения пакету больше не нужен внешний менеджер памяти borlndmm.dll, а вместо него будет работать rtl100.bpl.
- В С++ 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();
Ссылки по теме
Файлы для загрузки