| Author |
Message |
henry_sys |
| Location: |
|
Post subject: [Ask] Free DLL Handle
Posted: 11/Nov/2011 13:47
|
|
onIntermediate

Joined: 24-Sep-2011
Posts: 34
Status: Offline
|
|
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
code : pascal 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
code : pascal 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 |
|
|
| |
|
|
|
 |
henry_sys |
| Location: |
|
Post subject: [Ask] Free DLL Handle
Posted: 11/Nov/2011 13:51
|
|
onIntermediate

Joined: 24-Sep-2011
Posts: 34
Status: Offline
|
|
[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
code : pascal 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
code : pascal 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 |
|
|
| |
|
|
|
 |
mat_koder |
| Location: |
|
Post subject:
Posted: 17/Nov/2011 11:58
|
|
onUber-Skilled

Joined: 16-Jan-2006
Posts: 344
Status: Offline
|
|
Cuman ngeliat sepintas saja :
code : pascal 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 -) |
_________________ ..... good enough is not enough........
|
| |
|
|
|
 |
henry_sys |
| Location: |
|
Post subject:
Posted: 18/Nov/2011 15:23
|
|
onIntermediate

Joined: 24-Sep-2011
Posts: 34
Status: Offline
|
|
|
mat_koder wrote:
Cuman ngeliat sepintas saja :
code : pascal 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
code : pascal 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  |
|
|
| |
|
|
|
 |
|
reminder2k1 |
| Location: Jakarta |
|
Post subject:
Posted: 19/Nov/2011 02:08
|
|
onKnowledgeable

Joined: 24-Jul-2007
Posts: 251
Location: Jakarta
|
|
Yang perlu di perhatikan ketika bermain DLL adalah, USE SHAREMEM di file .dpr yang akan mengexecute .dll tersebut...
Apakah sudah spt itu??? |
_________________
Code:
uses crt;
begin
writeln('Delphi 4ever');
end.
|
| |
|
|
|
 |
mat_koder |
| Location: |
|
Post subject:
Posted: 19/Nov/2011 11:39
|
|
onUber-Skilled

Joined: 16-Jan-2006
Posts: 344
Status: Offline
|
|
code : pascal 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:
code : pascal 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 ). |
_________________ ..... good enough is not enough........
|
| |
|
|
|
 |
henry_sys |
| Location: |
|
Post subject:
Posted: 22/Nov/2011 15:51
|
|
onIntermediate

Joined: 24-Sep-2011
Posts: 34
Status: Offline
|
|
Untuk sementara saya temukan solusi untuk memfree semua Object pada Finalization
code : pascal Initialization RegisterClass(ClassOfForm); Finalization if Assigned(ObjectOfForm) then ObjectOfForm.Free; UnRegisterClass(ClassOfForm);
Pada AppMain
code : pascal 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..... |
|
|
| |
|
|
|
 |
|
|