обработка объектов при помощи DLL
Добавлено: 18 окт 2009, 14:02
К сожелению не смог найти аналогичных тем или вопросов в сети. Сразу прошу извинения, если задам тупой вопрос.
Опишу в чем суть проблемы. Есть библиотечка с модальным окном, я ее одгружаю динамически и вызываю окно, в которое передаю экземпляр своего класса. После освобождения по FreeLibrary исчезает и сам экземпляр.
[syntax='Delphi']
// GD - основной объект с которым работаю внутри главного модуля
// SubGD - нужен для того чтоб не передавть на прямую GD(просто думал
//что из- за прямой передачи касяк)
procedure TFrmMain.ActGenDataExecute(Sender: TObject);
var
SubGD: TGeneralData;
HandleProc: THandle;
ShowGD : procedure(AppHandle:THandle; var GD:TGeneralData;
AdmDB: string;CityDB:string); stdcall;
begin
// подгружаю DLL
HandleProc := LoadLibrary(GenData);
if HandleProc > 32 then
begin
// создаю еще один экземпляр класса (так как через основной вообще
// не работает)
SubGD := TGeneralData.Create;
SubGD.Assign(GD);
// подгружаю метод библиотеки
ShowGD := GetProcAddress(HandleProc,'ShowGenData');
// вызываю
ShowGD(Application.Handle,SubGD, DBDir + DBAdmRn, DBDir + DBCity);
// передаю данные в основной экземпляр
GD.Assign(SubGD);
// грохаем лишний объект
SubGD.Free;
SubGD := nil;
Application.ProcessMessages;
// тут еще пока существует объект GD
FreeLibrary(HandleProc);
// а тут уже нет
end;
end;
[/syntax]
Прошу строго не судить за такой вопрос, я по образованию строитель
Опишу в чем суть проблемы. Есть библиотечка с модальным окном, я ее одгружаю динамически и вызываю окно, в которое передаю экземпляр своего класса. После освобождения по FreeLibrary исчезает и сам экземпляр.
[syntax='Delphi']
// GD - основной объект с которым работаю внутри главного модуля
// SubGD - нужен для того чтоб не передавть на прямую GD(просто думал
//что из- за прямой передачи касяк)
procedure TFrmMain.ActGenDataExecute(Sender: TObject);
var
SubGD: TGeneralData;
HandleProc: THandle;
ShowGD : procedure(AppHandle:THandle; var GD:TGeneralData;
AdmDB: string;CityDB:string); stdcall;
begin
// подгружаю DLL
HandleProc := LoadLibrary(GenData);
if HandleProc > 32 then
begin
// создаю еще один экземпляр класса (так как через основной вообще
// не работает)
SubGD := TGeneralData.Create;
SubGD.Assign(GD);
// подгружаю метод библиотеки
ShowGD := GetProcAddress(HandleProc,'ShowGenData');
// вызываю
ShowGD(Application.Handle,SubGD, DBDir + DBAdmRn, DBDir + DBCity);
// передаю данные в основной экземпляр
GD.Assign(SubGD);
// грохаем лишний объект
SubGD.Free;
SubGD := nil;
Application.ProcessMessages;
// тут еще пока существует объект GD
FreeLibrary(HandleProc);
// а тут уже нет
end;
end;
[/syntax]
Прошу строго не судить за такой вопрос, я по образованию строитель