Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: CL | DM;

Вниз

неявное связывание с 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 его юнита отсутствует ссылка на юнит с декларацией этого класса ?

Оч просто:

- в bpl

 RegisterClass(TMyForm);

- в вызывающем коде

var  
 MyFormClass: TPersistentClass;
..
 MyFormClass :=GetClass("TMyForm");
 if Assigned(MyFormClass) then
   TFormClass(MyFormClass).Create(..);


Код будет 100%-но работать, если оба модуля собраны с рантайм-пакетами.

Не правда ли просто и изящно ?)
Никаких упоминаний о TMyForm в uses вызывающего юнита, теме не менее форма с легкостью создана !



Страницы: 1 вся ветка

Текущий архив: 2007.10.28;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.017 c
4-1177575482
capkoh
2007-04-26 12:18
2007.10.28
Повторное открытие диалога


1-1186404511
d_oleg
2007-08-06 16:48
2007.10.28
ObjAuto и Intel XEON


2-1191463004
Lex_!
2007-10-04 05:56
2007.10.28
Массивы объектов...


15-1191409720
PPop
2007-10-03 15:08
2007.10.28
Ну как указать этот Main-Class в файле manifest.mf?


15-1190990492
chief
2007-09-28 18:41
2007.10.28
CommSQ - ищу программистов для реализации OpenSource-проекта