L loskiller Unregistered / Unconfirmed GUEST, unregistred user! 2005-06-01 #1 我的程序中主程序和dll窗体都共享了一个全句变量Task:TList类型<br>我在dll中往Task里加了一个值,然后把dll释放,再在主程序里访问Task,<br>结果Task里的内容没了,报地址访问错误,但是我访问Task.count,还是会<br>显示正确的数字。这个问题可以解决吗?
我的程序中主程序和dll窗体都共享了一个全句变量Task:TList类型<br>我在dll中往Task里加了一个值,然后把dll释放,再在主程序里访问Task,<br>结果Task里的内容没了,报地址访问错误,但是我访问Task.count,还是会<br>显示正确的数字。这个问题可以解决吗?
L loskiller Unregistered / Unconfirmed GUEST, unregistred user! 2005-06-01 #2 我的程序中主程序和dll窗体都共享了一个全句变量Task:TList类型<br>我在dll中往Task里加了一个值,然后把dll释放,再在主程序里访问Task,<br>结果Task里的内容没了,报地址访问错误,但是我访问Task.count,还是会<br>显示正确的数字。这个问题可以解决吗?
我的程序中主程序和dll窗体都共享了一个全句变量Task:TList类型<br>我在dll中往Task里加了一个值,然后把dll释放,再在主程序里访问Task,<br>结果Task里的内容没了,报地址访问错误,但是我访问Task.count,还是会<br>显示正确的数字。这个问题可以解决吗?
A Another_eYes Unregistered / Unconfirmed GUEST, unregistred user! 2005-06-03 #3 先说说你如何“共享”这个全局变量的吧<br>要注意一点, 正常情况下由于delphi生成的dll自带内存管理,所以dll中分配的内存对exe中的内存管理器来说是不存在的,反之亦然。尽管可以互写对方分配的内存,因为对整个进程来说它们写的是是合法地址,但对dll或exe中内存管理器来说它们写的是非法地址,只是不报错而已。但是牵涉到写时需重新分配内存的时候(比如dll修改exe中分配的string)就会出问题了, 对dll或exe中的内存管理器来说,它重新分配时回收的那块是“非法”内存,重新分配后的是对方的“非法”内存地址。<br>所以要在dll和exe中“共享”内存变量是需要额外的工作的,目的就是把exe和dll中所用的内存管理器统一成一个。delphi推荐的方法是在project中第一个use ShareMem, 并将borlandmm.dll和你的程序一起打包。当然你也可以使用第三方的控件来达到这个目的。不过似乎修改.dpr并在第一顺位uses内存管理控件是件免不了的工作
先说说你如何“共享”这个全局变量的吧<br>要注意一点, 正常情况下由于delphi生成的dll自带内存管理,所以dll中分配的内存对exe中的内存管理器来说是不存在的,反之亦然。尽管可以互写对方分配的内存,因为对整个进程来说它们写的是是合法地址,但对dll或exe中内存管理器来说它们写的是非法地址,只是不报错而已。但是牵涉到写时需重新分配内存的时候(比如dll修改exe中分配的string)就会出问题了, 对dll或exe中的内存管理器来说,它重新分配时回收的那块是“非法”内存,重新分配后的是对方的“非法”内存地址。<br>所以要在dll和exe中“共享”内存变量是需要额外的工作的,目的就是把exe和dll中所用的内存管理器统一成一个。delphi推荐的方法是在project中第一个use ShareMem, 并将borlandmm.dll和你的程序一起打包。当然你也可以使用第三方的控件来达到这个目的。不过似乎修改.dpr并在第一顺位uses内存管理控件是件免不了的工作
C cslotus Unregistered / Unconfirmed GUEST, unregistred user! 2005-06-04 #4 Another_eYes讲得比较清楚了,再补充一点<br>如果定义函数的返回值,则对另一方访问的时候也是非法地址。若不使用sharemem,可以传引用参数,这样便能相互访问。
Z zjan521 Unregistered / Unconfirmed GUEST, unregistred user! 2005-06-04 #5 分配内存可以使用CoTaskMalloc/CoTaskFree.或者其他的系统API.对象的话也可以重载NewInstance.
A appfirst Unregistered / Unconfirmed GUEST, unregistred user! 2005-06-04 #6 如果你一定要使用共享的内存,建议你使用文件映射,方便还快捷,尽可能不要使用SHAREMEM,至于你的使用方法,我就不多说了,不过一点可以肯定,你需要更多的学习一下DELPHI对内存的管理。
L loskiller Unregistered / Unconfirmed GUEST, unregistred user! 2005-06-06 #8 问题解决了,谢谢大家。<br>我用接口解决了全局变量的问题。用带包编译也可以解决这个问题。