各位高人们:
    我建立了一个ActiveX DLL然后引入了一个Form目的是为了放置Winsock控件(作为TCP服务端接收TCP客户的数据)。
    在DLL中只有一个函数:
    function get_data()
        get_data=ask_data()   '返回接收到的数据,ask_data()是From中的函数        
    end function
    
    在Form中引入一个winsock控件(tcpServer):
    function ask_data
       If tcpServer.State <> 0 Then
          tcpServer.Close
       End If       tcpServer.LocalPort = 1002
       tcpServer.Listen
   
   
       tcpServer.SendData "send"     '命令TCP客户端发送数据
    end function    Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)
       '接收TCP客户端发来的数据,然后将收到的数据赋给全局字符串变量data_str
       tcpServer.GetData strData
       data_str= data_str & strData
    end sub    Form中的其它代码省略.......我通过PHP或ASP调用Dll的get_data希望获得TCP客户端传过来的数据。目前我已经证实通过PHP或ASP调用Dll的get_data方法确实可以由服务端winsock控件接收到数据
问题是:接收到的数据不能返回调用者(即PHP或ASP),当ASP调用了get_data()后立即执行
Form中的ask_data,接下来客户端开始发数据,tcpServer的DataArrival事件不断被触发,每接到一批数据便拼接到全局字符串data_str结尾,但是get_data始终返回空串,我觉得原因可能是DLL中的get_data函数的执行与Form中winsock控件接收数据并赋值给字符串data_str是并发在进行,而winsock接收数据要花一定的时间,反之get_data函数的执行很快,在winsock控件尚未接收到数据之前就已经返回给调用者(ASP)了,所以ASP始终得到的是空串。如何解决这个问题,如何才能控制get_data方法的返回时机?

解决方案 »

  1.   

    ask_data 做个处理,当tcpServer_DataArrival以后 data_str《》“”以后再让这个函数完成,否则就doevents
      

  2.   

    get_data当然返回空字串,因为你调用的是ask_data,这个函数只是发送数据而已。当然你也不能等待数据返回。
    解决办法是在DLL中再建立一个函数,该函数返回data_str的数据,然后在PHP和ASP中反复调用该函数取得数据。
      

  3.   

    zyg0(影子(成功减肥10斤,可给我饿坏了,我要补回来) :
    我怎样才能在tcpServer_DataArrival中控制是否让ask_data函数结束并返回
    谢谢!!!!!!!!!!!!!
      

  4.   

    guxingfeiyu(孤星飞雨):
    我试过你的方法可惜还是不行。
    zyg0(影子(成功减肥10斤,可给我饿坏了,我要补回来) :
    多谢,ok了。
      

  5.   

    接收后保存到一个文件中或内存中,分段吧,然后asp请求一下则分一段给它,建个id,表示目前获取数
    比如:总收到100条数据,已被asp请求30条,asp请求时就能过内存中发送或者:
    建两个winsock控件,一个专门是接收外部,一个专门和asp通讯