freelibrary 的问题(100分)

  • 主题发起人 主题发起人 fenghuo
  • 开始时间 开始时间
F

fenghuo

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个函数,动态调用链接库中的一个模式窗体,窗体没有问题,<br>在使用中,发现一个怪问题<br><br>我的代码如下:<br>function SWF2EXE(): boolean;<br>var<br> &nbsp;libHandle: THandle;<br> &nbsp;SWF2EXE: TSWF2EXE;<br>begin<br> &nbsp;libHandle := loadLibrary('swfTools.dll');<br> &nbsp;@SWF2EXE := getProcaddress(libHandle, 'SWF2EXE');<br> &nbsp;SWF2EXE(Application.Handle);<br> &nbsp;//FreeLibrary(libHandle);<br> &nbsp;result := true;<br>end;<br><br>如果我使用 <br>freelibrary(LibHandle)这句,当关掉窗体时,主程序就自动最小化.<br>而不起这句时,则没有问题,请问是什么原因?
 
DLL 中是否有对 Application.Handle 的操作?
 
要看SWF2EXE这个函数内怎么写的了。关闭窗口时会判断一个TCloseAction个属性,看看它的值是不是变成caMinimize了。你在窗体的关闭事件(FromClose)中加入一句Active:=caFree看看。
 
因为你的SWF2EXE函数使用了主调程序的句柄作为参数,所以我猜想你的DLL里面应该是用这个句柄来同步DLL自己的句柄了。如果是这样的话,建议你的这个SWF2EXE函数在返回之前先把原先DLL自己句柄恢复回来。这样可以避免发生一些莫名其妙的问题(包括DLL窗体被隐藏或最小化等等)。另外在DLL窗体的OnClose事件里面写Active:=caFree有时其实并不能真正销毁窗体,如果是这样的话可以在SWF2EXE函数结束前用FreeAndNil过程来手动销毁窗体对象。
 
參考一下這個:<br>procedure TfrmCallDLL.btnCallDLLClick(Sender: TObject);<br>var<br> &nbsp;LibHandle: THandle;<br> &nbsp;ShowForm: TShowForm;<br>begin<br> &nbsp;LibHandle := LoadLibrary('RptDLL.DLL');<br> &nbsp;try<br> &nbsp; &nbsp;if LibHandle = HINSTANCE_ERROR then<br> &nbsp; &nbsp; &nbsp;raise EDLLLoadError.Create('Unable to Load DLL');<br> &nbsp; &nbsp;@ShowForm := GetProcAddress(LibHandle, 'ShowForm');<br> &nbsp; &nbsp;if not (@ShowForm = nil) then<br> &nbsp; &nbsp; &nbsp;ShowForm;<br> &nbsp;finally<br> &nbsp; &nbsp;FreeLibrary(LibHandle);<br> &nbsp;end;<br>end;
 
帮顶!<br><br>╭=========================================╮<br><br> &nbsp; 80G海量源代码,控件,书籍全免费狂下不停!<br><br> &nbsp; http://www.source520.com<br> &nbsp; <br>╰=========================================╯
 
后退
顶部