![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
неявное связывание с bpl [XP]
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
Ну и зачем все эти извращения ?