C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Builder & Delphi, Вопрос о совместимости
Schumi
Отправлено: 17.07.2005, 19:49


Машинист паровоза

Группа: Участник
Сообщений: 206



Меня заинтересовала совместимость. И потому у меня 2 вопроса:
1) есть некий модуль (cpp,h), где реализованы некоторые функции в BCB. Как мне использовать эти функции в Delphi?
2) есть пакет,ну очень хороший. Но сделаны они для BCB6 и Delphi5-6-7, а я пишу на BCB5. Не знаю как их использовать. Я могу взять из Delphi5 bpl,но BCB еще нужны lib и bpi — как их добыть и для чего они нужны? Или их невозможно использовать?
Sl@Sh
Отправлено: 18.07.2005, 03:26


Мастер участка

Группа: Участник
Сообщений: 383



Можно просто создать dll, а ёё потом использовать и в программе на Делфи и на Билдере.
romario
Отправлено: 18.07.2005, 08:45


Ученик-кочегар

Группа: Участник
Сообщений: 14



1. Примерно так

BCB:
int __fastcall Hello(char* HelloStr);
далее компилируешь свой модуль .cpp в объектный файл

DELPHI:
{$L MyModul.obj}
...
function Hello(HelloStr: PChar): Integer; external;

2. По поводу установки компонентов, если есть исходники, то я думаю проблем быть не должно
AVC
Отправлено: 18.07.2005, 09:00


Ветеран

Группа: Модератор
Сообщений: 1583



По 1 встречался с такой проблемой.
Есть проект у которого части написаны на C и Delphi одновременно, основное на C. Для использования базовых функций C в модулях на pascal я создавал промежуточный файл "переходников" и давал его "делфисту".
Пример файла
CODE

// void __fastcall IniFormRestore (TForm *frm, bool size, bool setstyle, const AnsiString &postfix)
procedure cpp_IniFormRestore(pfrm: TForm; setsize, setstile : boolean; var pfix: AnsiString);
external 'HcCommon.bpl'
name '@IniFormRestore$qqrp11Forms@TFormoorx17System@AnsiString';
procedure IniFormRestore(pfrm: TForm; setsize, setstile : boolean);


// void __fastcall FormCheckMinHW (Forms::TForm *, int, int)
procedure FormCheckMinHW(pfrm: TForm; minH, minV: integer);
external 'HcCommon.bpl'
name '@FormCheckMinHW$qqrp11Forms@TFormii';

implementation

procedure IniFormRestore(pfrm: TForm; setsize, setstile : boolean);
var vname: AnsiString;
begin
vname := '';
cpp_IniFormRestore(pfrm, setsize, setstile, vname);
end;


Использование в Delphi
CODE

procedure TfmMain.FormCreate(Sender: TObject);
begin
 IniFormRestore(self, true, true);
end;

procedure TfmMain.FormResize(Sender: TObject);
begin
 FormCheckMinHW(self,351,447);
end;


Так что оформление C-шных функций в виде библиотеки может вам помочь."Переходники", в основном, нужны для преобразования типов параметров из Delphi к C.
Schumi
Отправлено: 18.07.2005, 18:41


Машинист паровоза

Группа: Участник
Сообщений: 206



QUOTE (romario @ 18/07/2005, 08:45)
По поводу установки компонентов, если есть исходники, то я думаю проблем быть не должно

Не мог бы уточнить: к примеру, есть исходники от Delphi5, но толку от них, если я ничего не могу открыть. А по части BCB6 — так он начинает запрашивать такие вещи, которые есть только в BCB6.
romario
Отправлено: 19.07.2005, 08:15


Ученик-кочегар

Группа: Участник
Сообщений: 14



Создаешь пакет, подключаешь нужные pas-модули и другие пакеты, билдишь его, устанавливаешь в среду
Я сам сам только начал переходить на BCB c Delphi, так все компоненты с которыми в Дельфях работал, без проблем устанавливаю в BCB
Были конечно небольшие глючки, то BCB заголовки hpp кривые генерил, то пакеты какие-то ненужные к проекту подключал, но это ведь все ручками легко правиться...
Schumi
Отправлено: 19.07.2005, 18:19


Машинист паровоза

Группа: Участник
Сообщений: 206



Я как сделал: создал в bcb5 новый пакет и добавил туда все pas-файлы из пакета D5. Стал компилировать — после этого он стал требовать разные dcu, я их добавил, в смысле переписал в папку с новым пакетом. И после этого — он затребовал уже obj-файлы. Ясный, у меня их нет. Посмотрел в D5 — там есть одноименные файлы, но с расширением dcu. И как мне из них получить obj, или мой пакет bcb5 заставить использовать dcu, не знаю.

Самое интересное: смотрю а пакет на D5  — в нем используются типа pas-файлы, но их реально нет, а есть их dcu файлы, но он их подключает, и отсюда, наверное, проблемы в BCB5.
romario
Отправлено: 20.07.2005, 11:10


Ученик-кочегар

Группа: Участник
Сообщений: 14



Короче, ничего у тебя к сожалению не получиться, ибо нет исходников (pas)
Schumi
Отправлено: 20.07.2005, 19:28


Машинист паровоза

Группа: Участник
Сообщений: 206



Да... или надо переходить в bcb6 cool.gif...хотя надо ли?
romario
Отправлено: 21.07.2005, 09:33


Ученик-кочегар

Группа: Участник
Сообщений: 14



На Delphi biggrin.gif
GIZMO
Отправлено: 21.07.2005, 10:16


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (Schumi @ 20/07/2005, 19:28)
Да... или надо переходить в bcb6 cool.gif...хотя надо ли?

Нет.
Schumi
Отправлено: 21.07.2005, 19:02


Машинист паровоза

Группа: Участник
Сообщений: 206



QUOTE
На Delphi

Моя любовь к С++ не знает границ.
Sl@Sh
Отправлено: 23.07.2005, 04:26


Мастер участка

Группа: Участник
Сообщений: 383



QUOTE (Schumi @ 21/07/2005, 19:02)
Моя любовь к С++ не знает границ.

И правильно. В крайнем случае переходите на VC++.
Schumi
Отправлено: 23.07.2005, 22:12


Машинист паровоза

Группа: Участник
Сообщений: 206



Хотел очень сильно извратиться: создал в bcb6 dll, где была всего одна функция: void CreateVcl(TForm *form) — в ней я динамически создавал все нужные вещи из супер-пупер пакета, который нельзя поставить под bcb5.
Потом создал exe в bcb5 и попытался выполнить ф-цию из длл.
Обломс — AV, видимо все же не судьба, жалко, хотя ведь обычные кнопочки и панельки создавать можно sad.gif
Георгий
Отправлено: 25.07.2005, 21:42


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (Schumi @ 23/07/2005, 23:12)
Хотел очень сильно извратиться: создал в bcb6 dll, где была всего одна функция: void CreateVcl(TForm *form) — в ней я динамически создавал все нужные вещи из супер-пупер пакета, который нельзя поставить под bcb5.
Потом создал exe в bcb5 и попытался выполнить ф-цию из длл.
Обломс — AV, видимо все же не судьба, жалко, хотя ведь обычные кнопочки и панельки создавать можно sad.gif

а выравнивание, declspec указали?
Schumi
Отправлено: 26.07.2005, 18:51


Машинист паровоза

Группа: Участник
Сообщений: 206



QUOTE
а выравнивание, declspec указали?

Не совсем я понял... Ну в общем ф-цию в длл объявлял так:
CODE
extern "C" void __stdcall __export CreateVcl(TForm *form)

А в exe грузил через LoadLibrary/GetProcAd..(не помню окончание)/FreeLibrary. Но если что, то функция начинала выполняться  — вставлял ShowMessage,и застревал на первой строчке с new, где создавал элемент.

Вернуться в Вопросы программирования в C++Builder