如果处理在ActiveX库中的COM对象访问数据库时产生的重新连接问题?(100分)

  • 主题发起人 主题发起人 Shavid
  • 开始时间 开始时间
S

Shavid

Unregistered / Unconfirmed
GUEST, unregistred user!
主程序调用ActiveX库中的COM对象,而COM对象又访问数据库,
主程序已经在定义全局TDatabase,且也定义全局DatabaseName,
在调用COM对象时,COM对象里数据控件也用相同的DatabaseName,
每次使用时,主程序里的TDatabase已经连接数据库了,
但是在调用COM对象的方法时,每次都会弹出对话框要重新登录一遍,
好象是重新建立数据库连接一次,请问众位高手该如何解决?
 
>>在调用COM对象时,COM对象里数据控件也用相同的DatabaseName
光用“相同的DatabaseName”不行,Session也要传过去,
或者直接用tdatabase替换掉COM中的tdatabase之类,
总之要把实际的对象统一起来。
 
agree with 温柔一刀
 
首先谢谢温柔一刀和jqw关注!
我的COM中用的是TTable,已经试过将TDatabase传入该COM中,即在COM中定义一变量为
TDatabase类,然后在主程序将一连接的TDatabase类变量传给它,但仍不起作用.
至于将Session同时传入,请问如何传入,是将SessionName传入吗?我已经SessionName传入
但同样不起作用.请诸高手指教.
 
>>是将SessionName传入吗?我已经SessionName传入但同样不起作用

前面我说得很清楚了,不能只传Name之类的东西,要传对象本身:

例如:在DLL中定义DLLSetSession(ParentSession:TSession);
然后在主程序中DLLSetSession(Session)
而DLL中 (先SaveSession:=Session之类)Session:=ParentSession;
然后使用DatabaseName就可以了。

其他类似(如果不想传Session)
 
谢谢温柔一刀的关注!
1.我对TDatabase对象基本就是按照你的方法试的,但仍不起作用.
2.我的对象最后是要包装成OLE/COM中的Automation对象,该类对象只支持IDispatch类接口
指针,无法直接传TSession对象.
请继续指教.
 
>>我对TDatabase对象基本就是按照你的方法试的,但仍不起作用.
如果“无法直接传TSession对象”,又怎么能“TDatabase对象基本就是按照你的方法试的”呢?
不太明白你的意思。

IDispatch类接口指针和传对象应该没有什么关系,
如果不行可以作为整数或OleVariant之类传,不过我没试过。
尤其是关于COM对象是否能够同一般DLL那样共享宿主程序的
连接我还真不知道,也许我对COM机制还不完全了解??

时间,唉!真是没时间...
 
hi,温柔一刀
是这样的,我先做成了DLL,然后想进一步做成OLE/COM对象.
我刚问到一个方法可以将对象的指针转成OLEVariant传到ActiveX库中的COM对象,我刚按
你的方法试了将TDatabase对象传到COM对象中,但不起作用.明天我再试试TSession.
请继续指教.
 
hi,温柔一刀
谢谢你的指教,问题基本搞定。
只有两个小问题,再请教一下。
1、将Session传入后,在DLL中的操作完后,重新回主程序时,是否会对主程序的数据库
操作产生影响?比如说要是否要重新连接?
2、当将ActiveX库的COM对象删除时,不知是否要将DLL中的Session关闭?
再次感谢你的帮助。
 
1.不影响,不需要重新连接
2.不要关闭,因为那是主程序的对象(如果关闭了,就影响到1了),
只需要使用,什么也不要做。

另外,推出的时候是应该恢复COM/DLL中原来的Session,以免造成泄漏。
(见我前面写的SaveSession:=Session,最后应该Session:=SaveSession)
 
hi,温柔一刀
现在看来,ActiveX库(DLL)和一般的DLL还是有点不一样,特别是对Session,因为我将
主程序的Session传给ActiveX的DLL中的Session后,调用DLL中的COM对象的一个方法后,
这个方法里有用TTable打开一张表显示一下,回到主程序时,发现主程序的Session中的
Database被关闭了,而在调用这个方法之前,我刚刚查过这个Database是打开的;其次
在COM对象的Destroy方法里,要将Session关闭,否则COM对象无法完全释放,系统被死
锁。当然这里面如同你说的,我事先保存了ActiveX DLL中的Session,退出时还原该
Session。不知你的看法如何?
我的解决方法时在ActiveX DLL中根据传入的主程序的Session生成一个本DLL中Session
的Database,相当于另外建立一个连接,则一切正常使用。
请继续指教。
 
这个问题以后我有时间试验一下,看看是否如你所说,
也许COM DLL和一般DLL在这方面确有不同。

>>我的解决方法时在ActiveX DLL中根据传入的主程序的Session生成一个本DLL中Session
>>的Database,相当于另外建立一个连接,则一切正常使用。
如何生成?不需要再次输入用户名和密码?另外再次建立一个连接也确实违反初衷,
唉!我现在就是缺时间...,以后再看看吧...
 
hi,温柔一刀
我在主程序的Database的参数属性已经保存了用户名和密码,而在DLL中可以从传入过去的
Session中取得主程序的Database,所以不需要用户再次输入用户名和密码,再建立一个连
接也是实在没有办法的事情。
我也希望你能试试看COM DLL和一般 DLL是否如我所说的不同,如真是不同结论,请发
E-MAIL给我,我的E-MAIL是 shavidchung@netease.com。
认识你很高兴,能和你交个朋友吗?如愿意,请将你的E-MAIL发给我。
 
多人接受答案了。
 
后退
顶部