关于调用DLL文件的问题,请各位高手指点,急!急!急! (100分)

  • 主题发起人 zhuwanhai
  • 开始时间
Z

zhuwanhai

Unregistered / Unconfirmed
GUEST, unregistred user!
<br>&nbsp; &nbsp; &nbsp; &nbsp; 关于调用DLL文件的问题,请各位高手指点,急!急!急! &nbsp; &nbsp;100分<br><br>&nbsp;一. &nbsp;编程环境: Delphi5.0 &nbsp;和 SQL Server 7.0<br>&nbsp;二. &nbsp;问题背景:<br>&nbsp; &nbsp; &nbsp; &nbsp;将“劳人子系统”根据模块划分为几个DLL文件,用一个公用的调用程序来调用这几个DLL文件;程序如下:<br>&nbsp; &nbsp;……. <br>&nbsp; &nbsp;MyHandle:=LoadLibrary(pchar(s_dll)); &nbsp; &nbsp; &nbsp; <br>&nbsp; @MyProc:=GetProcAddress(Myhandle,'showMDIChildForm'); <br>&nbsp; &nbsp;Myproc(application.Handle,fm_xh,pchar(yhbs));<br>&nbsp; // FreeLibrary(Myhandle);<br>&nbsp;<br>注:s_dll :是DLL 文件的名称;<br>showMDIChildForm &nbsp;是每个DLL文件的输出程序,其内容都一样;<br>&nbsp; &nbsp; fm_xh 和yhbs 是自己设置的标志;<br><br>三.问题:<br>&nbsp; &nbsp; &nbsp; 1。在程序运行后,点击某个模块的菜单项,调用他的DLL文件,程序正确运行(单独调用每个DLL文件都正确运行);<br>&nbsp; &nbsp; &nbsp; 但当调用任意其他模块的DLL文件(即点击其他模块的菜单项)后,即报错:Name not unique (名称不唯一),然后是BDEengire(BDE引擎)的错误;即不能在程序中调用两个不同的DLL;<br>&nbsp; &nbsp; &nbsp; 2.上述程序,在其他几个子系统(各自都划分为几个DLL文件) 均没问题,但“劳人子系统”与其他子系统不同的是:<br>A. 劳人子系统中用了BDE的连接和ADO的连接,而其他子系统只用了ADO;<br>B. 劳人子系统中每一模块都有自己的DataModule(放置Table 和Query)窗口,但它们共用一个BDE的接口,即所有的Table和Query 共用一个Database Name;<br>难道不能共用一个Database吗?<br>是DLL文件没有及时释放?<br>在DLL程序中用到BDE(database)该注意什么?<br>我该如何解决这上问题!!!<br>&nbsp; &nbsp;3.用FreeLibrary(Myhandle) 时,则程序运行到该语句时,即死机;(书上讲,在调用DLL文件后,需释放,但我一用就死机);<br>&nbsp; &nbsp; 如何用FreeLibrary()函数?请指点!!!<br>
 
为什么不用"包"呢?<br>检查TDatabase 的别名要设成可共享
 
‘Name not unique’肯定数在数据库打开的时候报错。<br>建议为每个DLL建立单独的Database和Session,Session的<br>AutoSessionName设为True。这样可以避免自己建名字的问题。如果<br>还不行,自己在OnCreate的写一段代码,利用文件、注册表等<br>机制就可以简单的加上检查机制,实现Database的名字不一致。
 
可以在Dll中公用主程序的DATabase和session,<br>但必须在调入dll函数时传递参数给它,<br>在dll卸载时应释放这些变量.<br>即在finalization 中设它们为nil.
 
个个都是高手呀。。。。
 
不要在各个dll用相同的database name打开数据库,只需要在住程序打开一次<br>其他dll就可以使用了。<br><br>freelibrary前,dll里面打开的所有东西要先关闭(handle、窗口、在本<br>dll打开的数据库(别人打开的就不用关了)),
 
在我的有关问答中已详述,可参考一下!
 
大家说的都有道理,我的解决方法是合并成一个DLL,谢谢大家。<br>经常交流,
 
顶部