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

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

DBE + динамическая загрузка пакета [D5]


FOX ©   (2003-05-29 13:30:00) 

Приветствую всех.

Суть вопроса в следующем: имеется приложение, которое динамически загружает пакет.
Приложение компилируется с выключенной опцией “Build with runtime packages”. При загрузке
пакета выдается сообщение “Application is not licensed to use this feature”. При отладке выяснилось, что в конструкторе объекта TdataSet ищется ресурс с именем “DVCLAL” и если он его не находит, то генерится Exception с выше сказанным текстом (MainInstance=0, а в пакете нет такого ресурса). Так вот сам вопрос: корректно ли инициализировать MainInstance пакета значением MainInstance приложения (по образу передачи Application.Handle, на простейшем примере работает).

Пояснения к коду
TForm1-форма основного приложения.
_Execute-экспортируема из пакета функция.
TdataSetNew – полностью аналогичен TdataSet.
TFormLoadBPL-форма из пакета.

Загрузка пакета из приложения
procedure TForm1.Button1Click(Sender: TObject);
type TPackagepExec = procedure(const Handle: HWND; mInstance: LongWord); stdcall;
var FPackageHandle : HMODULE;
ExecProc : TPackagepExec;
begin
FPackageHandle := LoadPackage( ExtractFilePath( Application.ExeName) + "testBPL5.bpl");
if FPackageHandle = 0 then RaiseLastWin32Error()
else begin
@ExecProc := GetProcAddress( FPackageHandle, "_Execute");
if Assigned(ExecProc)
then ExecProc( Application.Handle, MainInstance)
else raise Exception.Create("Invalid Package File");
end;
UnloadPackage( FPackageHandle);
end;

Вызываемая функция из пакета
procedure _Execute(const Handle: HWND; mInstance: LongWord); stdcall;
var sHandle: HWND;
sInstance: LongWord;
begin
sHandle := Application.handle;
Application.handle := Handle;
sInstance := MainInstance;
MainInstance := mInstance;
FormLoadBPL := TFormLoadBPL.Create( Application);
try
FormLoadBPL.showmodal;
finally
FormLoadBPL.free;
end;
Application.handle := sHandle;
MainInstance := sInstance;
end;
//тестовый код
procedure TFormLoadBPL.Button2Click(Sender: TObject);
var ds : TDataSetNew;
begin
ds := TDataSetNew.Create(nil);
ds.free;
end;


FOX   (2003-05-29 15:05:00) [1]

To Desdechado

>>1. БДЕ при чем?
Да по большому счету ни причем (просто изначально проблема выявилась при создании TQuery(и копалось в сторону BDE), а уж потом выяснились что дело в базовом классе TDataSet)

>>2. зачем такие извраты?
А в чем собственно изврат, в динамической загрузке пакета?
Собирать приложение с включенной опцией “Build with runtime packages”, есть вариант забыть
какой-нибудь пакет(больше похоже на отговорки). Делать все это в dll – размер (реализовано сейчас). А так уже больше спортивный интерес.

С наилучшими пожеланиями FOX.


Desdechado   (2003-05-29 14:28:00) [2]

1. БДЕ при чем?
2. зачем такие извраты?


Наверх

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