Arsip: [Ask] Free DLL Handle

 
user image
more 9 years ago

henry_sys

Para suhu Delphi sekalian saya mau tanya dan mohon pencerahan... saya buat 1 aplikasi dengan DLL (Dynamic Link Library) kemudian saya buat 1 aplikasi lg utk panggil DLL yg tadi. Pada proses pemanggilan dan handle Form program berjalan dengan baik, tetapi ketika saya ingin terminate/Close program pemanggil ada pesan error Memory (Acces violation......) walaupun DLL nya udah saya Free sebelum Terminate, ini Coding Pemanggil DLL saya

type
.......
.......
private
    MyReport : THandle;
    CallReport : procedure (vParentApplication: TApplication; vControl:TWinControl); stdcall;
.....
.....
procedure TFmMain.FormCreate(Sender: TObject);
begin
  if MyReport = 0 then
     MyReport := LoadLibrary('Reports.Dll');
end;
procedure TFmMain.Reports1Click(Sender: TObject);
begin
  if MyReport <> 0 then
  begin
    @CallReport := GetProcAddress(MyReport,'ShowMain');
    CallReport(Application, cxTabsheet1);
  end;
end;
procedure TFmMain.Exit1Click(Sender: TObject);
begin
  if MyReport <> 0 then
     FreeLibrary(MyReport);
  Close;
end;
Sorce DLL nya

procedure ShowMain(vParentApplication :TApplication; vComControl:TWinControl); stdcall;
begin
  Application.CreateForm(TDmReports,DmReports); {Create dataModule utk Keneksi DB}
  Application:= vParentApplication;
  vControl := vComControl;
  FmMainReport := TFmMainReport.CreateParented(vComControl.Handle);
  FmMainReport.QuMenu.Open;
  FmMainReport.Show;
end;
  exports ShowMain;
klu saya Trace error itu terjadi ketika FreeLibrary..... mohon bantuan para master2 sekalian
user image
more 9 years ago

henry_sys

[Double Thread, and Has Be Merged, by mas_kofa] Para suhu Delphi sekalian saya mau tanya dan mohon pencerahan... saya buat 1 aplikasi dengan DLL (Dynamic Link Library) kemudian saya buat 1 aplikasi lg utk panggil DLL yg tadi. Pada proses pemanggilan dan handle Form program berjalan dengan baik, tetapi ketika saya ingin terminate/Close program pemanggil ada pesan error Memory (Acces violation......) walaupun DLL nya udah saya Free sebelum Terminate, ini Coding Pemanggil DLL saya

type
.......
.......
private
    MyReport : THandle;
    CallReport : procedure (vParentApplication: TApplication; vControl:TWinControl); stdcall;
.....
.....
procedure TFmMain.FormCreate(Sender: TObject);
begin
  if MyReport = 0 then
     MyReport := LoadLibrary('Reports.Dll');
end;
procedure TFmMain.Reports1Click(Sender: TObject);
begin
  if MyReport <> 0 then
  begin
    @CallReport := GetProcAddress(MyReport,'ShowMain');
    CallReport(Application, cxTabsheet1);
  end;
end;
procedure TFmMain.Exit1Click(Sender: TObject);
begin
  if MyReport <> 0 then
     FreeLibrary(MyReport);
  Close;
end;
Sorce DLL nya

procedure ShowMain(vParentApplication :TApplication; vComControl:TWinControl); stdcall;
begin
  Application.CreateForm(TDmReports,DmReports); {Create dataModule utk Keneksi DB}
  Application:= vParentApplication;
  vControl := vComControl;
  FmMainReport := TFmMainReport.CreateParented(vComControl.Handle);
  FmMainReport.QuMenu.Open;
  FmMainReport.Show;
end;
  exports ShowMain;
klu saya Trace error itu terjadi ketika FreeLibrary..... mohon bantuan para master2 sekalian
user image
more 9 years ago

mat_koder

Cuman ngeliat sepintas saja :

Application.CreateForm(TDmReports,DmReports); {Create dataModule utk Keneksi DB}
Application:= vParentApplication;
apa memang benar-benar logix code anda seharusnya demikian? (hanya bertanya saja - it would not generate error on compiling -)
user image
more 9 years ago

henry_sys

@mat_koder: Cuman ngeliat sepintas saja :

Application.CreateForm(TDmReports,DmReports); {Create dataModule utk Keneksi DB}
Application:= vParentApplication;
apa memang benar-benar logix code anda seharusnya demikian? (hanya bertanya saja - it would not generate error on compiling -)
CreateForm itu construktor yg berguna untuk mengcreate class TDmReport dan menampungnya kedalam object dengan nama DmReport itu yg saya tahu kalau salah mohon diperbaiki, Tetapi program itu tidak error dan Running Normal klu agan pingin lihat(bkn mksd menggurui) coba buka *.dpr project delphi biasanya secara default akan menulis

uses
.......
.......
begin
Application.initialized;
Application.CreateForm(NamaKelas,NamaObject);
.....
.....
Application.Run;
end.
untuk kasus saya semua TForm/TComponent sudah saya inisialisasi jadi tinggal di "Create" aja dan "Action := Cafree" untuk free Object ketika di close Yang jadi masalah saya adalah bagaimana membuat procedure untuk memfree seleruh object yg telah saya create, baru kemudian melepas Handle tanpa klik close pada tiap Form Mohon pencerahan para master delphi sekalian..... It'is Urgent :?
user image
more 9 years ago

reminder2k1

Yang perlu di perhatikan ketika bermain DLL adalah, USE SHAREMEM di file .dpr yang akan mengexecute .dll tersebut... Apakah sudah spt itu???
user image
more 9 years ago

mat_koder


    Application.CreateForm(TDmReports,DmReports); {Create dataModule utk Keneksi DB}
    Application:= vParentApplication;
bukankah baris2 hrs lebih dahulu dari baris 1 ( dari segi logic-nya ) ? coba buat begini:

var
   OldDLLAppHandle : THandle;
    procedure ShowMain(vParentApplication :TApplication; vComControl:TWinControl); stdcall;
    begin
    Application.Handle := vParentApplication.Handle;
    Application.CreateForm(TDmReports,DmReports); {Create dataModule utk Keneksi DB}
    vControl := vComControl;
    FmMainReport := TFmMainReport.CreateParented(vComControl.Handle);
    FmMainReport.QuMenu.Open;
    FmMainReport.Show;
    end;
    exports ShowMain;

initialization
OldDLLAppHandle := Application.handle;

finalization
Application.handle := OldDLLAppHandle;
jangan lupa waktu di main-app , deklarasi ShowMain harus benar ( stdcall calling ).
user image
more 9 years ago

henry_sys

Untuk sementara saya temukan solusi untuk memfree semua Object pada Finalization

Initialization
    RegisterClass(ClassOfForm);
Finalization
   if Assigned(ObjectOfForm) then
      ObjectOfForm.Free;
   UnRegisterClass(ClassOfForm);
Pada AppMain

procedure TFmMain.CloseMainApp;
begin
   UnRegisterModuleClasses(NamaHandle);{Procedure untuk mengeksekusi finalization pada ObjectOfForm}
   FreeLibrary(NamaHandle);
   Close;//Application.Terminate;
end;
Mohon masukan dari master-master sekalian ttg cara yg saya gunakan.....
more ...
  • Pages:
  • 1
Share to
Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com