Вниз
Скачать: CL | DM;

DBE + динамическая загрузка пакета   Найти похожие ветки 

← →
FOX ©   (2003-05-29 13:30) [0]

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

Суть вопроса в следующем: имеется приложение, которое динамически загружает пакет.
Приложение компилируется с выключенной опцией “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;


← →
Desdechado ©   (2003-05-29 14:28) [1]

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


← →
FOX ©   (2003-05-29 15:05) [2]

To Desdechado

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

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

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



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.015 c
7-84776
Andy
2003-04-16 11:47
2003.06.26
Сменить Volume ID


14-84607
kaif
2003-06-08 20:20
2003.06.26
Мощи Андрея Первозванного


7-84786
_ALEXey_
2003-04-09 19:03
2003.06.26
Запрет всех контекстных меню в системе (ловушка)


3-83941
Stam
2003-05-23 10:26
2003.06.26
Ошибка при работе с Oracle - ORA-04031. Помогите...


1-84369
[BAD]Angel
2003-06-16 23:17
2003.06.26
Помогите с ListBox




   Наверх