DLL 的问题求教:Access violation at ******** (50分)

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

zys1975117

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个主程序调用一个DLL程序,DLL程序中有一个窗体,上面有一个Database,table,
datasource,dbgrid连接到数据库。我运行程序时没有问题,但当我退出主程序时,就出错
了:“project c:/comm/comm.exe faulted with message:'access violation at 0x4be4359d:
read of address oxffffdecc'.”,不过如果我在DLL程序的窗体的关闭事件中加入action:=caFree
退出时就不会出现这个错误了,是什么原因?请无往不教了。
另外,我的程序的每个DLL中单独用自己DATABASE,这样好吗?有什么不好吗?

另外,为什么我在DLL的窗体上放一个DCOMConnection控件,激活后,其它DLL来调用这个DLL时,
这个程序就会死掉为什么?
 
[1]
由于DLL中的窗体都是动态创建的,所以如果要关闭的话,就应该从内存中彻底将它释放掉,
除非你是想暂时隐藏窗口,那样可以不释放。通过Delphi的在线帮助,你应该知道action:=caFree
就是彻底释放的意思啊。同时Form又是很多控件的载体,比如:你上面说的Database,table,
datasource,dbgrid。这样在Form没有释放的时候,他们也没释放。所以,退出主程序时就出错
了。
[2]
>>我的程序的每个DLL中单独用自己DATABASE,这样好吗?有什么不好吗?
如果调用的是同一个数据库的话,这样不好!浪费资源不说,如果协调不好,还会造成一些
意想不到的错误。所以,这时候应该使用“包”。
下面是我从书上抄下来的:
包与普通DLL的区别:
(1) VCL元件只能在同一个模块内被访问,主程序不能直接访问DLL中的VCL元件;反之,DLL
也不能直接访问主程序中的VCL元件。
(2) 每个使用VCL元件的DLL都要加上一段VCL框架代码,这段代码的长度大约在100~200K左右。
关于他们的区别还可看看这里,说得很清楚的。
http://delphi.about.com/library/weekly/aa010901a.htm
 
小笨笨,我近来提的两个问题,都是你回答积极,谢谢你。可以交个朋友吗?你的QQ号是
多少?我的是16217849.
 
欧,实在抱歉,没能看到你这个回信,那一阵子,我的邮箱总是一下就来数十封信,好几次都
实在懒得看,就删掉了。
我没有QQ,我的信箱是:taibenle@163.com (太笨了@163.com,嘻嘻)
怎么?你这个问题还有什么不明白的,代码贴出来。
 
to 小笨笨:谢谢。问题我已经解决了,因为我的程序都是用DLL来封装,不想包,也
考虑到别的程序的调用,所以DLL的调用参数也只能用PCHAR,所以我也想问一下,对于
数据库的方面有什么好的意见?
 
我并没有说在DLL中使用数据库不行,只不过,在Delphi编程中,在这方面包比DLL有优势。
>>所以DLL的调用参数也只能用PCHAR
这是完全正确的,我就不喜欢使用string做参数,不仅其他语言写的程序无法调用,即便给
Delphi写的程序用,也要加上ShareMem单元。很不爽!
C++语言中没有专门的字符串类型,不也很好吗?我现在就是不用DLL时也倾向于使用PChar。
>>对于数据库的方面有什么好的意见?
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1763134
 
另外,为什么我在DLL的窗体上放一个DCOMConnection控件,激活后,其它DLL来调用这个DLL时,
这个程序就会死掉为什么?
 
已经搞定了。原因就是不要一开始就激活。并且最后要记着关闭这个联接。
 
DCOM我知之甚少,这几个帖子,你看看吧
http://www.delphibbs.com/delphibbs/dispq.asp?LID=234260
http://www.delphibbs.com/delphibbs/dispq.asp?LID=990304
 
后退
顶部