Форум: "Базы";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "Базы";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.037 c