怪问题,怪问题,很怪的问题,我愿意加分到450。(100分)

  • 主题发起人 主题发起人 ggb1999
  • 开始时间 开始时间
G

ggb1999

Unregistered / Unconfirmed
GUEST, unregistred user!
忙乎了一天
发现一个大问题,如下:
我在写了一个通讯用的dll文件,里面其中一个类chan是继承Tclientsocket的
私有成员里面有myclientsocket对象,属性里面,分别加了对myclientsocket的
address和port的read/write操作(一切和不在dll里面的代码基本一样,我写得比较熟了)
接下去,怪事就来了,
无论我如何对这个clientsocket对象如何open后发送数据(sendbuf(.....)),
只能触发测试服务器程序的serversocket控件的ClientConnect和Accept事件,
serversocket死活收不到数据,而我试着用
一般非dll的程序来发包给这个测试的serversocket事件,ok,晕倒。

我先是在open后面加了sleep(由于是dll里面的东东,没有办法用applicaion.procemess...
那个),无效,我用了sleep(10000),而后换成了循环(100000次),这个等待我想够大了,
但是无效阿。

那位大哥碰到过这个问题,救救小弟了。

 
你的dll用什么方式来装载的,用动态装入试试。还有,装载dll的应用是否是一个无效应用。
 
这涉及好多方面,单凭这些恐怕无法判断原因。
有类及其成员对象的初始化问题。
主程序中对象的创建问题。
创建后是否一直持有。
 
可以跟踪一下你sendbuf是否成功,如果发送成功了,那就是server端处理有问题。
我估计还是控件创建后没有被保持的问题。
 
主要是我的外壳程序是多线程的,
每个线程都调用一个dll的缘故,多线程里面处理的不太好,导致socket的缓冲部分有点问题,
浪费大家的脑力了,不好意思。

不好意思,给分了

 
哈哈,发现还是有问题,后来发现是我调用的dll里面调用的另一个dll的加载方式有问题,
不知道rake8888对dll里面调用dll的加载方式有没有什么了解,我现在是摸黑着测试了一下,
发现第一个dll用stdcall,里面那个dll用cdcall,ok,其中第一个dll是delphi,有
socket部分写的,里面那个dll是vc写的,是数据的加密解密,(主要是本人二个阶段
的产品,现在想废物利用而已),如果都用stdcall调用,会报内存无法读,我用delphi的
cpuview看的时候发现调用里面那个dll的函数以后,堆栈在退出时候,对应的地址竟然是
’??????‘或者有个地址为‘0’,我想是不是相对地址全部成了绝对地址了,这个
是本人的猜想而已,不知道你有什么建议,或者谈谈dll几种装载方式的不同之处,我想再
开个贴,讨论讨论,如何?
 
对于这个问题,我试了一下,是那个因为你vc中输出是用了cdecl的原因,
如vc中也用stdcall,外面调用用stdcall就没有问题了,因为stdcall与cdecl的要求不一样,
stdcall的Clean-up是Routine,而cdecl是Caller;不知这样行吗?你试试。

<<好象cdcall是错了.应是cdecl吧>>;
 
后退
顶部