Форум: "Начинающим";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
Внизнеявное связывание с bpl Найти похожие ветки
← →
sydenis (2007-10-01 14:54) [0]если использовать функцию из bpl путём неявного связывания со своей программой типа
unit MyProg;
......
function FuncFromBPL: Byte; stdcall; external "MyPackage.bpl";
то обязательно надо ставить галочку "build with runtime packages"?
Как-то неудобно это - сразу вся VCL и всё прочее выгружается в пакеты... А хотелось бы как с dll - всё в exeшнике, и что-то выборочно из dll
← →
sydenis (2007-10-01 14:57) [1]про LoadPackage и GetProcAddress просьба не рассказывать - интересует именно вышеописанный случай
← →
Игорь Шевченко © (2007-10-01 15:07) [2]
> то обязательно надо ставить галочку "build with runtime
> packages"?
Можно не ставить.package MyPkg;
.....
requires
rtl;
contains
PkgMain in "PkgMain.pas";
end.
unit PkgMain;
interface
function Foo: Integer; stdcall;
exports Foo;
implementation
uses
Windows;
function Foo: Integer;
begin
Result := MessageBox(HWND_DESKTOP, "Foo has been called", "Package", MB_OK);
end;
end.
program PkgUser;
uses
Forms,
main in "main.pas" {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
function Foo: Integer; stdcall; external "MyPkg.bpl";
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Foo;
end;
end.
← →
Сергей М. © (2007-10-01 15:07) [3]
> обязательно надо ставить галочку "build with runtime packages"?
Не обязательно.
← →
DrPass © (2007-10-01 15:10) [4]
> то обязательно надо ставить галочку "build with runtime
> packages"?
Не обязательно. Но если твоя функция использует что-либо из RTL/VCL, то без этой галочки будет нехорошо :)
Т.к. пакет-то тянет зависимости только из других пакетов, а в твоем приложении будет вкомпилирована своя собственная копия RTL.
И, кстати, в том пакете функция объявлена именно как stdcall (зачем???), или ты это так, написал потому что где-то увидел?
← →
sydenis (2007-10-01 15:41) [5]
> в том пакете функция объявлена именно как stdcall (зачем?
> ??), или ты это так, написал потому что где-то увидел?
да - просто "где-то увидел"... а в bpl нормальный (паскалевский) порядок аргументов?
> Можно не ставить.
Вот и я пробовал не ставить и всякий раз ловил AV, хотя судя по отладчику управление нормально передавалось в пакет, но функция не исполнялась. Правда там (в функции) было создание новой формы, т.е. как раз использование RTL/VCL... значит всё-таки без глаки не обйтись?
D2007
← →
Игорь Шевченко © (2007-10-01 15:43) [6]
> И, кстати, в том пакете функция объявлена именно как stdcall
> (зачем???), или ты это так, написал потому что где-то увидел?
>
AFAIK на имя экспортируемой фукнции влияет.
← →
Сергей М. © (2007-10-01 15:44) [7]
> в bpl нормальный (паскалевский) порядок аргументов?
Для твоего случая это порядок определяешь ты сам.
> Правда там (в функции) было создание новой формы, т.е. как
> раз использование RTL/VCL
Ну и зачем все эти извращения ?
← →
sydenis (2007-10-01 16:22) [8]
> Ну и зачем все эти извращения ?
ты про какие?
есть желание иметь в bpl набор стандартных для меня функций которые (увы) пользуют VCL. Я ещё не знаю как потом мне удобнее будет их юзать -
через GetProcAddress, через uses, или через неявное связывание...
вот и пытаюсь обкатать варианты
← →
Сергей М. © (2007-10-01 16:45) [9]
> ты про какие?
Про создание формы таким проктологическим способом.
← →
Сергей М. © (2007-10-01 16:52) [10]
> управление нормально передавалось в пакет, но функция не
> исполнялась
А что, оттрассировать ход исполнения вызова религия не позволяет ?
← →
sydenis (2007-10-01 16:53) [11]
> Про создание формы таким проктологическим способом.
форма - просто частный случай, и чем этот способ более проктологичнее чем любой другой из перечисленных?
и еще насчёт Для твоего случая это порядок определяешь ты сам.
ты имеешь ввиду, что специально указано stdcall? Так я бы лучше этого не делал если бы знал, что можно
← →
sydenis (2007-10-01 16:53) [12]
> А что, оттрассировать ход исполнения вызова религия не позволяет
> ?
читай внимательней
← →
sydenis (2007-10-01 16:56) [13]
> А что, оттрассировать ход исполнения вызова религия не позволяет
> ?
сорри... поподробнее
← →
Сергей М. © (2007-10-01 16:59) [14]
> чем этот способ более проктологичнее чем любой другой из
> перечисленных?
Тем что создание формы (и не только ее), размещенной в bpl, выглядит гораздо проще:
SomeBPLFormReference := TMyBPLForm.Create(..)
И для этого не нужны выкрутасы с явным экспортом.
← →
Сергей М. © (2007-10-01 17:01) [15]
> поподробнее
Что "поподробнее" ?
Коль ты отследил передачу управления, значит имеешь возможность трассировать собственно выполнение вызванной тобой подпрограммы.
← →
Германн © (2007-10-01 17:05) [16]
> Коль ты отследил передачу управления, значит имеешь возможность
> трассировать собственно выполнение вызванной тобой подпрограммы.
>
Имеет возможность, но наверно не умеет ею воспользоваться.
← →
sydenis (2007-10-01 17:41) [17]
> Имеет возможность, но наверно не умеет ею воспользоваться
наверно так и есть...
после входа в процедуру сразу после begin ещё до первого оператора получаем AV
> SomeBPLFormReference :=
что за ссылка имеется в виду?
← →
Сергей М. © (2007-10-01 17:49) [18]
> после входа в процедуру сразу после begin ещё до первого
> оператора получаем AV
Что, прямо так и говорит "На тебе AV !" ? Безо всяких комментариев ?)
> что за ссылка имеется в виду?
Например, переменная типа TMyBPLForm, если она необходима.
← →
sydenis (2007-10-01 20:23) [19]
> Что, прямо так и говорит "На тебе AV !" ? Безо всяких комментариев
> ?)
Access violation at address 20160DEE in module "vcl100.bpl". Read of address 000000AC
> > что за ссылка имеется в виду?
> Например, переменная типа TMyBPLForm, если она необходима.
но ведь это возможно, тока когда сам пакет установлен для дезигн-тайма и записан uses? а мне этого не надо
← →
evvcom © (2007-10-02 09:01) [20]
> когда сам пакет установлен для дезигн-тайма
какой-такой "дезигн-тайма"? У тебя выполнение идет. Почему ты считаешь, что переменные нужны только для "дезигн-тайма"? Для дизайна они (явные в глобал секции интерфейса), также как и для рантайма вовсе не обязательны. Я так вообще их всегда чикаю, если это не MainForm или MainDataModule, которые по сути должны создаваться в единственном экземпляре.
← →
Сергей М. © (2007-10-02 09:14) [21]
> Access violation at address 20160DEE
Вот и посмотри, какому из модулей принадлежит этот адрес.
> то возможно, тока когда сам пакет установлен для дезигн-
> тайма и записан uses?
Да глупости)
Юнит Forms у тебя фигурирует в проектах обоих модулей ? Фигурирует.
Т.е. класс TForm известен обоим взаимодействующим модулям, если они собраны с рантайм-пакетами.
Ну так и что мешает сделать так:
var
MyPLForm: TForm;
..
MyPLForm := TMyBPLForm.Create(..);
?
Ничто не мешает.
Форма с успехом создается.
← →
sydenis (2007-10-02 10:02) [22]
> MyPLForm := TMyBPLForm.Create(..);
это понятно, но если это код вызывающего приложения то класс TMyBPLForm должен же быть ему известен - а откуда оно о нём знает если uses не указан?
а установка пакета для дезигн-тайма - потому что как я ещё скажу компилятору чтоб он не ругался на uses unit_from_bpl
← →
Сергей М. © (2007-10-02 10:18) [23]
> класс TMyBPLForm должен же быть ему известен
Зачем ?
В случае явно экспортруемой тобой ф-ции тебя ведь не интересует класс формы, создаваемой в теле ф-ции ? Не интересует.
Ну так и здесь тоже самое, только без извращений)
← →
sydenis (2007-10-02 10:47) [24]
> Зачем ? .... только без извращений)
:)))) я наверно не понимаю твоего замысла во всём его масштабе
напиши, плиз, его целиком, а то - насколько я понял - ты предлагаешь сделать следующее:
- в пакете:
TNewForm = class(TForm)
....
- в программе, без использования uses:
var NF: TForm;
....
NF=TNewForm.Create(...);
Не понимаю как это возможно, поправь где ошибка
← →
Сергей М. © (2007-10-02 10:51) [25]
> ты предлагаешь сделать следующее
Да, именно это и предлагаю.
> Не понимаю как это возможно
Что не понимаешь-то ? Как в переменной типа TForm окажется ссылка на TNewForm ? Оч просто окажется - в рез-те выполнения оператора присвоения :=.
← →
Сергей М. © (2007-10-02 11:07) [26]А, я понял.
Тебя интересует, откуда вызывающий код знает о TNewForm, если в uses его юнита отсутствует ссылка на юнит с декларацией этого класса ?
Оч просто:
- в bplRegisterClass(TMyForm);
- в вызывающем коде
var
MyFormClass: TPersistentClass;
..MyFormClass :=GetClass("TMyForm");
if Assigned(MyFormClass) then
TFormClass(MyFormClass).Create(..);
Код будет 100%-но работать, если оба модуля собраны с рантайм-пакетами.
Не правда ли просто и изящно ?)
Никаких упоминаний о TMyForm в uses вызывающего юнита, теме не менее форма с легкостью создана !
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.043 c