DLL 介面函式
function LoadDllForm(AHandle, AParent: HWnd): TForm; stdcall;
begin
Application.Handle := AHandle;
Application.CreateForm(TfrmTest, frmTest);
try
frmTest.ParentWindow := AParent;
frmTest.BorderStyle := bsNone;
frmTest.WindowState := wsMaximized;
frmTest.Show;
Result := frmTest;
except
Result := nil;
frmTest.Free;
end;
end;
主程式采用靜態呼叫
DLL介面函式申明
function LoadDllForm(AHandle, AParent: HWnd): TForm; stdcall; external 'TestDLL.dll'
主程式呼叫
frmDllForm:= LoadDllForm(Application.Handle, Panel1.Handle);
主程式顯示都正常,可是程式關閉的時候,我怎么釋放frmTest物件呢?直接frmDllForm.Free只是frmTest父物件的注銷函式啊
uj5u.com熱心網友回復:
一般遵循哪里創建,哪里釋放的原則,你可以把創建的視窗句柄保存起來,然后再寫一個方法,Export出去,傳遞句柄,然后再你內部找到對應的表單,然后DLL中釋放。也就是說,你上面的LoadDllForm回傳一個Handle,然后再寫一個FreeDLLForm,引數為LoadDllForm回傳的句柄,然后自己去處理uj5u.com熱心網友回復:
有一個比較麻煩的事情,知道句柄,怎么獲取這個物件事例呢?能幫忙解答不?uj5u.com熱心網友回復:

囧,你DLL中自己保存一下就行了啊,用一個Hash保存一下就是了,然后根據句柄找到你保存的物件釋放就行了!
uj5u.com熱心網友回復:
關閉程式前通過句柄釋放。uj5u.com熱心網友回復:
能否給出簡單代碼uj5u.com熱心網友回復:
//偽代碼
var
List: TStringList;
function LoadDllForm(AHandle, AParent: HWnd): THandle; stdcall;
begin
Application.Handle := AHandle;
Application.CreateForm(TfrmTest, frmTest);
try
frmTest.ParentWindow := AParent;
frmTest.BorderStyle := bsNone;
frmTest.WindowState := wsMaximized;
frmTest.Show;
Result := frmTest.Handle;
if list= nil then
begin
list := TStringList.create;
end;
list.AddObject(inttostr(Result),frmtest);
except
Result := nil;
frmTest.Free;
end;
end;
procedure LoadDllForm(AHandle: HWnd); stdcall;
begin
if list <> nil then
begin
idx := list.indexof(inttostr(AHandle));
if idx <> -1 then
List.Objects[idx].free;
end;
end;

都說的很明白了,還非要給出代碼。。。自己需要多思考一下的說。
uj5u.com熱心網友回復:
說的流氓一點 主程式都關閉了 行程死了就自動釋放了 不是處女座的你也可以不管了 哈哈uj5u.com熱心網友回復:
procedure TForm.FormClose(Sender: TObject; var Action: TCloseAction);begin
action := cafree;
FmPrint := nil;
end;
uj5u.com熱心網友回復:
請使用 8 樓的方法轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/93175.html
標籤:VCL組件開發及應用
