关于调DLL窗体时,传一个EXE类实例作为参数,而被DLL无情释放类实例的某些指针的问题 ( 积分: 100 )

J

jettop

Unregistered / Unconfirmed
GUEST, unregistred user!
我建立了一个类:TMyClass ,TMyClass有ADO连接和系统的参数信息和一些事件和方法,在调DLL窗体时通过传入这个类,目的能让所有DLL窗体可以共享连接和系统的所有参数,也能让DLL能操作EXE的一些事件和方法.同时EXE也会对TMyClass进行操作,如参数赋值和事件实现等。当某个DLL打开后,若有对TMyClass的字符型属性有写操作时,当它关闭后,EXE再访问TMyClass的字符型属性时这个属性就不存在了,而引发异常。
字符型属性是PChar型,也试过用String型(有Uses ShareMem.pas)这个现象不会了。当是事件属性时,DLL关闭后还是释放了事件指针,当EXE再触发这个事件时,就象PChar属性一样,引发指针被释放的异常。
注:有用自定义内存管理器处理,但事件指针还是被释放了,EXE再放问此事件时也是发生异常。
请问:
1、我这种EXE与DLL共用一个类实例,以达到DLL与EXE互动的系统组织模式是否科学?
2、如何让DLL释放后,不会释放我在EXE中的类实例?
3、对指针型属性和事件,DLL有写或访问后,它们就会被跟随释放,而其它类型(如整数型)的就不会,为什么?
 
J

jettop

Unregistered / Unconfirmed
GUEST, unregistred user!
B

bsense

Unregistered / Unconfirmed
GUEST, unregistred user!
你的积分比我还高啊,
不科学
建议啊,连接什么的可以dll里面复制使用
最好别用dll,
要用的话别传递object pascal的任何对象类型属性,
如果非要用,就用bpl,dll虽然可以封装各种object pascal 对象,但我查了很多资料都说不建议那样使用,因为是非官方支持.
 
G

guanyue7613

Unregistered / Unconfirmed
GUEST, unregistred user!
1、这种EXE与DLL的传递,是指针的传递,是可以的
2、用全局试试
3、在堆中的会自动释放,分配到栈中就不会了
 
J

jettop

Unregistered / Unconfirmed
GUEST, unregistred user!
to :guanyue7613
请问如何分配到栈中?
 
L

lsz100

Unregistered / Unconfirmed
GUEST, unregistred user!
J

jettop

Unregistered / Unconfirmed
GUEST, unregistred user!
用内存映射能否解决这个问题??
 
X

xifengge

Unregistered / Unconfirmed
GUEST, unregistred user!
内存映射可以解决问题,但是效率就低了。
 
Q

qiuyan81

Unregistered / Unconfirmed
GUEST, unregistred user!
可以传递的~不要用类 用record集合类型
声明的时候
PConnClass=^TConnClass;
TConnClass=Record
constr: string;//连接字符串 DLL用string用引用内存管理 或者用PChar的也行.
Conn: TADOConnection;
end;
在EXE与DLL都声明这个类型结构 传递的时候
var
p: PConnClass;
begin
new(p);
p^.constr:= '连接字符';
p^.conn := MyConn;
func(p)
end;

DLL:
function func(aConnClass:pConnClass):boolean;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
931
SUNSTONE的Delphi笔记
S
顶部