能否在VC的DLL中实现多线程,在Delphi中使用?
能否在VC的DLL中实现多线程,在Delphi中使用?
比如: 在VC的DLL中开两个线程,一个负责接受数据,另一个负责处理这些数据。将处理的结果返回到Delphi中使用。
问题点数:100、回复次数:8Top
1 楼flyelf(空谷清音)回复于 2003-12-02 09:05:18 得分 20
应该可以吧,上层应用只关心接口,不需要知道内部是如何实现的Top
2 楼vcforever(累)回复于 2003-12-02 09:49:54 得分 30
在VC的DLL中是可以使用多线程的,不过最好不要在DllMain中启动线程,因为这个时候有可能DLL本身的初始化工作还没有完成,而启动线程又要用到其他的DLL,并对其进行初始化,这样就有可能造成启动线程失败,所以最好在DLL本身的初始化结束后在启动线程,这样会比较安全。
下面是两种导出DLL中的函数的方法,这两种方法导出的函数都可以供Delphi开发的程序调用
第一种方法是为编程项目建立一个.def文件并在该.def文件中加上类似下面的EXPORTS节:
EXPORTS
MyFunc
当Microsoft的链接程序分析这个.def文件时,它发现_MyFunc@8和MyFunc均被输出由于这两个函数名是互相匹配的(除了截断的尾部外),因此链接程序使用MyFunc的.def文件名
来输出该函数,而根本不使用_MyFunc@8的名字来输出函数。
现在你可能认为,如果使用Microsoft的工具创建一个可执行模块,并且设法将它链接到包
含未截断名字的DLL,那么链接程序的运行将会失败,因为它将试图链接到称为_MyFunc@8
的函数。当然,链接程序进行了正确的操作,将可执行模块链接到名字为MyFunc的函数。如果想避免使用.def文件,可以使用第二种方法输出未截断的函数版本。在DLL的源代码模块中,可以添加下面这行代码:
#pragma comment(linker,"/export:MyFunc=_MyFunc@8")
这行代码使得编译器发出一个链接程序指令,告诉链接程序,一个名叫MyFunc的函数将
被输出,其进入点与称为_MyFunc@8的函数的进入点相同。第二种方法没有第一种方法容易,
因为你必须自己截断函数名,以便创建该代码行。另外,当使用第二种方法时, D L L实际上
输出用于标识单个函数的两个符号,即MyFunc和_MyFunc@8,而第一种方法只输出符号
MyFunc。第二种方法并没有给你带来更多的好处,它只是使你可以避免使用.def的文件而
已。
Top
3 楼Semigod()回复于 2003-12-02 10:42:48 得分 10
肯定是可以的啦,实再闲麻烦就用汇编写VC要写的代码Top
4 楼ychyzr(网游)回复于 2003-12-02 11:00:51 得分 0
谢谢大家!
是在Delphi调用DLL中函数时开启线程还是在DLL装入时开启呢?Top
5 楼ISunwu(刀口蒙特)回复于 2003-12-02 11:03:29 得分 10
当然是应该在调用DLL中函数时开启线程。Top
6 楼ISunwu(刀口蒙特)回复于 2003-12-02 11:04:17 得分 10
还有,一定要注意:在释放Dll前一定要确保该线程已经停止,否则会出异常。Top
7 楼u2m(醉到天亮说晚安(poople.blogcn.com) )回复于 2003-12-02 11:18:03 得分 20
肯定可以的啦,我用到很多类似的情况
应该是相应的导出函数中开启线程,然后再另一个函数中关闭此线程。你作上层接口应用
没必要考虑那么多,那是VC函数内部考虑的东西Top
8 楼ljzcom()回复于 2003-12-02 15:05:45 得分 0
vcforever(霓裳羽衣)真是厉害,学习中。。。Top




