有关DLL与数据库问题,出100分请求帮助(100分)

  • 主题发起人 主题发起人 tanxh
  • 开始时间 开始时间
T

tanxh

Unregistered / Unconfirmed
GUEST, unregistred user!
近日做一系统,被要求各模块功能要放在DLL中。在实现中遇到一个问题:
在主程序中定义了一个数据模块,包含有一Database。请问如何实现主程序与
DLL共用一个数据库连接。我阅读了论坛上的一些文章,也试着传databaseName,
SessionName,可不管用,使用DLL还是提示输入数据库登录信息。

在DLL中是否可以使用主程序数据模块中定义的数据集DataSet,怎么做?

分虽不多,请各位大侠多帮助,或提供线索。先谢了!!!
 
dll最好是传简单变量:如整数等,连STRING也最好改成PCHAR(应该后者是指针)。
如果传复杂类型,最好是指针。你看看MICROSOFT的DLL例子或API函数的参数就
可以知道了,它基本上都是用指针的。
 
1.传指针。
2.使用session对象。
3.如果让我做,我会使用BDE API,而不用Borland的东西。
 
我也关心该讨论
 
請去臺灣Inprise(www.Inprise.com.tw),里面有李維寫的文章,好象是叫:
"包的威力",里面有詳細的論述.
 
>>"也试着传databaseName,SessionName"

不是传SessionName,而是传Session本身,
和DatabaseName。 ^^^^^^^^^^^
另外,如果dll中也使用了tdatabase对象,
可以只传一个database.handle就可以了。
 
今天刚刚解决了这个问题,确实是Session的问题。
在DLL中定义一个全局的输出变量
__declspec(dllexport) TSession* m_Session;
在DLLMain中初始化中加入m_Session = Session;
然后在主程序的头文件中加入__declspec(dllimport) TSession* m_Session;
OnCreate实件中加入Session = m_Session;
一切正常了,不过我用的是C++Builder!
 
在数据模块中放置TSession,设置AutoSessionname为true;
设置database,query,table(包括dll中的)Sessionname;
在dll中创建数据模块


 
在主程中建立Database或session传递给Dll使用是不明智的。因为你没法避免使用
ShareMem.Pas单元。最佳的方法是建立一个专门的数据库处理模块,封装成DLL,
将你所有的查询集中起来,Dll之间只有简单数据通信。
 
这个问题在早期曾经激烈地辩论过,老兄可以查查看.
总的原则,主程序和DLL都用Runtime Package方式
编译,这样传递任何东东都可以,比如:数据库名.
 
为什么要用tsession用tdatabase就可以了
 
谈谈我的看法:
我个人认为将数据库功能封装在DLL中不是一个好作风,因为这个DLL依赖的东西太多了,
BDE和数据库,我认为DLL最好不使用其他“附带产品”,而只使用API函数。但是既然一定
要这么做的话,我建议使用ActiveX EXE技术,它自身也可运行也可被别的程序调用。
不知其他人看法如何?
 
是啊,將程序封裝在dll中,會碰到許多稀奇古怪的問題,最好別用
 
这个问题好象在1997年就有讨论,我记得是有个叫DELPHI的家伙说,将DLL中的数据库别名
去掉,将DATABASENAME的值和主程序的DATABASENAME的值一致,然后在编译DLL时采用
RUNTIME方式,则可以实现多个DLL和一个程序共享一个DATABASE。
 
后退
顶部