Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

неявное связывание с bpl [XP]


Страницы:   1 2

sydenis ©   (2007-10-01 14:54:00) 

если использовать функцию из bpl путём неявного связывания со своей программой типа
unit MyProg;
......
function FuncFromBPL: Byte; stdcall; external 'MyPackage.bpl';

то обязательно надо ставить галочку "build with runtime packages"?
Как-то неудобно это - сразу вся VCL и всё прочее выгружается в пакеты... А хотелось бы как с dll - всё в exeшнике, и что-то выборочно из dll


Сергей М.   (2007-10-02 11:07:00) [1]

А, я понял.

Тебя интересует, откуда вызывающий код знает о TNewForm, если в uses его юнита отсутствует ссылка на юнит с декларацией этого класса ?

Оч просто:

- в bpl

 RegisterClass(TMyForm);

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

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


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

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


Сергей М.   (2007-10-02 10:51:00) [2]


> ты предлагаешь сделать следующее


Да, именно это и предлагаю.


> Не понимаю как это возможно


Чтоне понимаешь-то ? Как в переменной типа TForm окажется ссылка на TNewForm ? Оч просто окажется - в рез-те выполнения оператора присвоения :=.


sydenis   (2007-10-02 10:47:00) [3]


> Зачем ?  ....  только без извращений)

:))))   я наверно не понимаю твоего замысла во всём его масштабе
напиши, плиз,  его целиком, а то - насколько я понял - ты предлагаешь сделать следующее:
- в пакете:
TNewForm = class(TForm)
....
- в программе, без использования uses:
var NF: TForm;
....
NF=TNewForm.Create(...);  

Не понимаю как это возможно, поправь где ошибка


Сергей М.   (2007-10-02 10:18:00) [4]


> класс TMyBPLForm должен же быть ему известен


Зачем ?

В случае явно экспортруемой тобой ф-ции тебя ведь не интересует класс формы, создаваемой в теле ф-ции ? Не интересует.

Ну так и здесь тоже самое, только без извращений)


sydenis   (2007-10-02 10:02:00) [5]


> MyPLForm := TMyBPLForm.Create(..);

это понятно, но если это код вызывающего приложения то класс TMyBPLForm должен же быть ему известен - а откуда оно о нём знает если uses не указан?

а установка пакета для дезигн-тайма - потому что как я ещё скажу компилятору чтоб он не ругался на uses unit_from_bpl


Сергей М.   (2007-10-02 09:14:00) [6]


> Access violation at address 20160DEE


Вот и посмотри, какому из модулей принадлежит этот адрес.


> то возможно, тока когда сам пакет установлен для дезигн-
> тайма и записан uses?


Да глупости)

Юнит Forms у тебя фигурирует в проектах обоих модулей ? Фигурирует.
Т.е. класс TForm известен обоим взаимодействующим модулям, если они собраны с рантайм-пакетами.

Ну так и что мешает сделать так:

var
 MyPLForm: TForm;
..

MyPLForm := TMyBPLForm.Create(..);

?

Ничто не мешает.

Форма с успехом создается.


evvcom   (2007-10-02 09:01:00) [7]


> когда сам пакет установлен для дезигн-тайма

какой-такой "дезигн-тайма"? У тебя выполнение идет. Почему ты считаешь, что переменные нужны только для "дезигн-тайма"? Для дизайна они (явные в глобал секции интерфейса), также как и для рантайма вовсе не обязательны. Я так вообще их всегда чикаю, если это не MainForm или MainDataModule, которые по сути должны создаваться в единственном экземпляре.


sydenis   (2007-10-01 20:23:00) [8]


> Что, прямо так и говорит "На тебе AV !" ? Безо всяких комментариев
> ?)

Access violation at address 20160DEE in module 'vcl100.bpl'. Read of address 000000AC

> > что за ссылка имеется в виду?
> Например, переменная типа TMyBPLForm, если она необходима.

но ведь это возможно, тока когда сам пакет установлен для дезигн-тайма и записан uses? а мне этого не надо


Сергей М.   (2007-10-01 17:49:00) [9]


> после входа в процедуру сразу после begin ещё до первого
> оператора получаем AV


Что, прямо так и говорит "На тебе AV !" ? Безо всяких комментариев ?)


> что за ссылка имеется в виду?


Например, переменная типа TMyBPLForm, если она необходима.


sydenis   (2007-10-01 17:41:00) [10]


> Имеет возможность, но наверно не умеет ею воспользоваться

наверно так и есть...
после входа в процедуру сразу после begin ещё до первого оператора получаем AV
> SomeBPLFormReference :=

что за ссылка имеется в виду?


Германн   (2007-10-01 17:05:00) [11]


> Коль ты отследил передачу управления, значит имеешь возможность
> трассировать собственно выполнение вызванной тобой подпрограммы.
>

Имеет возможность, но наверно не умеет ею воспользоваться.


Сергей М.   (2007-10-01 17:01:00) [12]


> поподробнее


Что "поподробнее" ?

Коль ты отследил передачу управления, значит имеешь возможность трассировать собственно выполнение вызванной тобой подпрограммы.


Сергей М.   (2007-10-01 16:59:00) [13]


> чем этот способ более проктологичнее чем любой другой из
> перечисленных?


Тем что создание формы (и не только ее), размещенной в bpl, выглядит гораздо проще:

SomeBPLFormReference := TMyBPLForm.Create(..)

И для этого не нужны выкрутасы с явным экспортом.


sydenis   (2007-10-01 16:56:00) [14]


> А что, оттрассировать ход исполнения вызова религия не позволяет
> ?

сорри...     поподробнее


sydenis   (2007-10-01 16:53:00) [15]


> А что, оттрассировать ход исполнения вызова религия не позволяет
> ?

читай внимательней


sydenis   (2007-10-01 16:53:00) [16]


> Про создание формы таким проктологическим способом.

форма - просто частный случай, и чем этот способ более проктологичнее чем любой другой из перечисленных?
и еще насчёт Для твоего случая это порядок определяешь ты сам.
 ты имеешь ввиду, что специально указано stdcall? Так я бы лучше этого не делал если бы знал, что можно


Сергей М.   (2007-10-01 16:52:00) [17]


> управление нормально передавалось в пакет, но функция не
> исполнялась


А что, оттрассировать ход исполнения вызова религия не позволяет ?


Сергей М.   (2007-10-01 16:45:00) [18]


> ты про какие?


Про создание формы таким проктологическим способом.


sydenis   (2007-10-01 16:22:00) [19]


> Ну и зачем все эти извращения ?

ты про какие?
есть желание иметь в bpl набор стандартных для меня функций которые (увы) пользуют VCL.  Я ещё не знаю как потом мне удобнее будет их юзать -
через GetProcAddress, через uses, или через неявное связывание...
вот и пытаюсь обкатать варианты


Сергей М.   (2007-10-01 15:44:00) [20]


> в bpl нормальный (паскалевский) порядок аргументов?


Для твоегослучая это порядок определяешь ты сам.


> Правда там (в функции) было создание новой формы, т.е. как
> раз использование RTL/VCL


Ну и зачем все эти извращения ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо