由于要与别的软件集成,需要编写一个用于通信的dll,封装TdTCPServer的时候不响应onExecute事件和ondisconect事件,但是onConnect事件可以响应。应该是线程问题,怎么解决?

解决方案 »

  1.   

    既然写Dll,干嘛还用控件,直接socket
      

  2.   

    dll中不要使用vcl,到时你就知道痛苦了。要不你就用包bpl。
      

  3.   

    自己封装socket太麻烦了,时间上来不及了,偷个懒。因为这个dll是给别的软件(不是delphi写的)集成用的,不能打成bpl。
    原因好像是dll中没有主线程,而事件相应是通过主线程来调用的,所以没有反映了。。
      

  4.   

    DLL中传递Delphi对象是很啰嗦的,尽量不要使用类
      

  5.   

    倒不是啰嗦,主要还是delphi对于内存的管理方式。可以看看那本《delphi in a nutshell》,中文好像叫《delphi 开发指南》。
    我引两段:使用DLL时,必须主要动态内存。任何由DLL分配的内存应该DLL被卸载后都将释放。但是,你的应用程序可能保留有指向那块内存的指针,如果不注意的话,它可能导致存取障碍或更糟糕的问题,最简单的解决办法是把ShareMem单元作为第一个单元在你的应用程序和它加载的每一个库里面使用。ShareMem单元把所有的内存请求重新指向一个单独的DLL(BorlndMM.dll),当应用程序运行时它一直被加载,你可以加载或者卸载DLL,而不必担心会把指针悬挂起来。......ShareMem 解决了一种内存问题,但解决不了另一种:类标识(classidentity)。 如果在应用程序和DLL中使用了类A,Delphi不能判断出两个模块使用的是同一个类。虽然两个模块使用相同的类名称,但这并不意味着这两个类是相同的。Delphi遵循最安全的路线,假定这两个类是不相同的,即使你知道得更多,但你也没有简单的办法来告诉Delphi。有时,具有不同的类标识并不会引起任何问题,但如果你的程序试图越过一个DLL的边界来使用一个对象的引用,则is和as操作符将不会按照你期望的方式工作,因为DLL认为类A与应用程序的类A不同,is操作符将永远返回False。一个避免该问题的办法是不越过DLL的边界传递对象。例如,你有一个图形对象,但不要传递一个TBitmap对象,而是传递一个Windows句柄(HBITMAP)来代替。另一个解决办法就是使用包。......如果使用DLL并试图在DLL之间或者在应用程序与DLL之间传递对象,那么你将会遇到一系列的问题。首先,每一个DLL和EXE都保持着其本身对类表的拷贝。对于在DLL和EXE之间传递的对象来说,is和as运算符将不能正确地工作。使用包可以解决这一问题。另一个问题是在DLL中分配的内存都归该DLL所有。当Windows卸载该DLL时,所有由这个DLL分配的内存都被释放,即使EXE或另一个DLL保留着指向该内存的一个指针亦是如此。在使用字符串、动态数组和Variant时,这将会成为一个主要的问题,因为你永远不知道Delphi什么时候会自动分配内存。解决办法是将ShareMem单元作为你的工程和每一个DLL的第一个单元。ShareMem单元安装一个内存管理器来重新指向所有对一个特殊DLL--BorlndMM.dll的内存分配请求。应用程序并不卸载BorlndMM,直到它退出为止。这种DLL魔术是公开进行的,所以你不用担心其细节。只要保证使用ShareMem单元,并保证它是程序和库使用的第一个单元即可。当你向客户或消费者发布你的应用程序时,需要将BorlndMM.dll包括进去。