Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.025 c
14-84561
RIMMER
2003-06-07 23:54
2003.06.26
Интерфейс и методы


11-84047
z00100
2002-09-28 04:34
2003.06.26
недопущение запуска второй копии программы


3-83872
Dem
2003-06-02 12:06
2003.06.26
Как создать пароль на базу данных


14-84724
ДиМАньяк
2003-06-05 16:19
2003.06.26
Win API


7-84796
Pegas222
2003-04-09 13:49
2003.06.26
TDirectoryListBox, TDriveComboBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский