從DLL中導出類,用于封裝窗體,現在我用SHOWMODAL方法SHOW窗體沒有問題,但是用SHOW的方法就會出現窗體不停閃爍的現象.請高手指點一下,分數不成問題

  • 主题发起人 主题发起人 lzhuan
  • 开始时间 开始时间
L

lzhuan

Unregistered / Unconfirmed
GUEST, unregistred user!
從DLL中導出類,用于封裝窗體,現在我用SHOWMODAL方法SHOW窗體沒有問題,但是用SHOW的方法就會出現窗體不停閃爍的現象.請高手指點一下,分數不成問題,只要問題解決,分數多少隨您要!!! (100分)<br />原來的問題是:如何從DLL中導出類,以及如何使用?
現在我已可以實現從DLL中導出類並可以調用起輸出的方法.
問題關鍵是為什麼用SHOW的方法會出現不停閃爍的現象.
我發現調用SHOW方法後CPU的佔用率一會就到了100%,然後死機.
跟蹤調試發現調用SHOW方法後DLL中的窗體會馬上釋放掉.可我並沒有調用任何讓其關閉或釋放的
的程式.
 
最好用Inproc COM实现,如果一定要自已用DLL,可以:
写一个基类作接口类,在DLL以此基类重载实现功能,将此基类加入主程序的工程中。
在DLL中写一个接口函数创建对象,并返回基类指针。
在主程序中写管理DLL的部分,调用DLL并通过接口函数取回基类指针,通过指针实现对DLL功能的调用。
DLL中应处理好接口类的创建和释放,以及资源保护。 

我用此方式为实现插件功能。
 
TO apw, :
您說的不錯,我就是想這樣做的DLL部分的代碼我已經基本實現.
可是主程序調用部分的代碼我做起來有問題.
能不能請您給一個簡單的例子
 
不知道怎麼了,dfw上的高手越來越少
 
我想问一下你在dll内创建窗体时 将主程序的句柄传给它了吗?
应该不会狂闪的!
 
傳了主程式的handle的,我發現問題所在了就是在主調程式中出了問題

function TfrmMain.CallDll(xDllID:string):boolean;
var
mStr:string;
hInst:Thandle ;
pt:TFarProc;
GetController:TGetController;
begin
mStr:=xDllID;
if mStr='' then exit;
mStr:='c_exe/'+mStr+'.dll';
hInst:=LoadLibrary(pchar(mStr)) ;
if hInst&gt;0 then
try
@GetController := GetProcAddress(hInst, 'GetController');
if Assigned(@GetController) then
begin
Fworker:= GetController;//FWorker這是從dll中輸出的類的實例

Fworker.init(varArrayof([0,0,0, FworkCenter.Handle]));
// Fworker.ShowModal ; 調用沒有問題的,只是我不想這樣做
Fworker.Visible:=True;//調用可以成功,但它還會繼續執行下一句
end;
finally
// FreeLibrary(hInst);//問題出現了,剛show起來,就要free了
end ;
現在的問題是這個被調起來的dll在那釋放它?

end;
 
我想可以這樣做,就是在主調程序中接收DLL窗體CLOSE的消息.
不知這樣是否可行?
 
主程序中保存所有show的子窗体的信息
在主程序退出时检查这些东西有没有释放
注意:传application的句柄和主窗体的句柄,效果是不一样的
最近也在用这方面的多窗体 烦 但是用户要求这样
顺便说一句,我不赞成输出类的做法
特殊的情况我不太了解,但是暗是不这么用的
 
和我的问题差不多!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2167933
 
TO Ball_cao
您提供的方法,我有考慮,就是在dll管理員(其實這個就是我的主調程式)管理相關信息.
但是dll管理員如何知道dll何時關閉?
如果是模式窗體當然沒有問題,可是現在是無模式的.
 
問題自己解決了,謝謝各位.
 
输出一个窗体释放方法就可以了.
 
多人接受答案了。
 
后退
顶部