Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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 его юнита отсутствует ссылка на юнит с декларацией этого класса ?

Оч просто:

- в bpl

 RegisterClass(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.056 c
2-1191463004
Lex_!
2007-10-04 05:56
2007.10.28
Массивы объектов...


2-1191823092
Kolan
2007-10-08 09:58
2007.10.28
Как запретить перерисовываться TScrollBox у?


15-1190980203
Booka Shade
2007-09-28 15:50
2007.10.28
Клик мышкой


1-1186988861
mixvictor
2007-08-13 11:07
2007.10.28
Печать через интернет


2-1191480773
MZ
2007-10-04 10:52
2007.10.28
проблема с утечкой памяти





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский