哪位老师给讲讲DDE的通讯机制
比如
1 发送端LinkExecute之后是否需要等待接受接收端接收完毕的信号
发送端如何确认接收端已经全部接收完毕
我遇到的问题是:如果接收端在LinkExecute事件中接收数据后直接进行一个很长时间的处理
发送段就会莫名其妙的超时(我已经在接收端的LinkExecute事件中第一时间设置了Cancel=False)
2 如何实现双向通讯 也就是 接受端在处理接收到的数据时 实时地把处理过程中产生的数据返回给发送端,这是否意味着原来的接收端变成了发送端?是否需要(/如何)重新建立连接
我遇到的问题是:在处理接收到数据时无法发送返回数据(在LinkExecute事件中没有报错信息),但如果用点按钮的方式则可以发送返回的数据。
发送端窗体部分代码:
Private Sub Command1_Click()
LinkAndSendMessage txt1.Text
End SubPrivate Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
Cancel = False
txtInfo.Text = CmdStr
End SubPrivate Sub LinkAndSendMessage(ByVal Msg As String)
Dim t As Long
txt1.LinkMode = 0 '注释:--
txt1.LinkTopic = "p2|DDE2" '注释: |______连接DDE程序并发送数据/参数
txt1.LinkMode = 2 '注释: | “|”为管道符,是“退格键”旁边的竖线,
txt1.LinkExecute Msg '注释:-- 不是字母或数字!t = txt1.LinkTimeout '注释:--
txt1.LinkTimeout = 1 '注释: |______终止DDE通道。当然,也可以用别的方法
txt1.LinkMode = 0 '注释: | 这里用的是超时强制终止的方法
txt1.LinkTimeout = t '注释:--
End Sub接受方代码Private Sub Command1_Click()
LinkAndSendMessage txt2.Tag
End SubPrivate Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
Dim i As Integer
Cancel = False
On Error GoTo errHdl
Do
i=i+Val(CmdStr)
LinkAndSendMessage i
DoEvents
Loop
Exit Sub
errHdl:
LinkAndSendMessage Err.Description
End SubPrivate Sub LinkAndSendMessage(ByVal Msg As String)
Dim t As Long
txt2.LinkMode = 0 ' 注释:--
txt2.LinkTopic = "P1|DDE1" ' 注释: |______连接DDE程序并发送数据/参数
txt2.LinkMode = 2
' 注释: | “|”为管道符,是“退格键”旁边的竖线,
txt2.LinkExecute Msg ' 注释:-- 不是字母或数字!
'txt2.LinkPoke
t = lblDDE.LinkTimeout ' 注释:--
txt2.LinkTimeout = 1 ' 注释: |______终止DDE通道。当然,也可以用别的方法
txt2.LinkMode = 0 ' 注释: | 这里用的是超时强制终止的方法
txt2.LinkTimeout = t 注:为了不浪费 暂时先给100分,如果有好的答案,我会再加分的。
谢谢!
比如
1 发送端LinkExecute之后是否需要等待接受接收端接收完毕的信号
发送端如何确认接收端已经全部接收完毕
我遇到的问题是:如果接收端在LinkExecute事件中接收数据后直接进行一个很长时间的处理
发送段就会莫名其妙的超时(我已经在接收端的LinkExecute事件中第一时间设置了Cancel=False)
2 如何实现双向通讯 也就是 接受端在处理接收到的数据时 实时地把处理过程中产生的数据返回给发送端,这是否意味着原来的接收端变成了发送端?是否需要(/如何)重新建立连接
我遇到的问题是:在处理接收到数据时无法发送返回数据(在LinkExecute事件中没有报错信息),但如果用点按钮的方式则可以发送返回的数据。
发送端窗体部分代码:
Private Sub Command1_Click()
LinkAndSendMessage txt1.Text
End SubPrivate Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
Cancel = False
txtInfo.Text = CmdStr
End SubPrivate Sub LinkAndSendMessage(ByVal Msg As String)
Dim t As Long
txt1.LinkMode = 0 '注释:--
txt1.LinkTopic = "p2|DDE2" '注释: |______连接DDE程序并发送数据/参数
txt1.LinkMode = 2 '注释: | “|”为管道符,是“退格键”旁边的竖线,
txt1.LinkExecute Msg '注释:-- 不是字母或数字!t = txt1.LinkTimeout '注释:--
txt1.LinkTimeout = 1 '注释: |______终止DDE通道。当然,也可以用别的方法
txt1.LinkMode = 0 '注释: | 这里用的是超时强制终止的方法
txt1.LinkTimeout = t '注释:--
End Sub接受方代码Private Sub Command1_Click()
LinkAndSendMessage txt2.Tag
End SubPrivate Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
Dim i As Integer
Cancel = False
On Error GoTo errHdl
Do
i=i+Val(CmdStr)
LinkAndSendMessage i
DoEvents
Loop
Exit Sub
errHdl:
LinkAndSendMessage Err.Description
End SubPrivate Sub LinkAndSendMessage(ByVal Msg As String)
Dim t As Long
txt2.LinkMode = 0 ' 注释:--
txt2.LinkTopic = "P1|DDE1" ' 注释: |______连接DDE程序并发送数据/参数
txt2.LinkMode = 2
' 注释: | “|”为管道符,是“退格键”旁边的竖线,
txt2.LinkExecute Msg ' 注释:-- 不是字母或数字!
'txt2.LinkPoke
t = lblDDE.LinkTimeout ' 注释:--
txt2.LinkTimeout = 1 ' 注释: |______终止DDE通道。当然,也可以用别的方法
txt2.LinkMode = 0 ' 注释: | 这里用的是超时强制终止的方法
txt2.LinkTimeout = t 注:为了不浪费 暂时先给100分,如果有好的答案,我会再加分的。
谢谢!
只是微软写的东西喜欢这个技术,貌似快捷方式也是拿这个做的。
看看这个
http://topic.csdn.net/t/20030901/12/2210236.html
但如果用剪贴板 又担心发生意外
还有什么其他的办法呢 一台机器上用winsock又有点夸张了
针对我的实际问题来说
超时问题可以暂且不管 但是服务器端如何确认客户端已经接收到了完整的数据 这个问题很让我烦恼
还有 客户端发送数据给服务器 直接用代码调用LinkAndSendMessage毫无反应 但手动点Command1在调用LinkAndSendMessage就可以成功发送数据到服务器端 这个问题更让我郁闷
(另:LinkPoke到底该怎么用呢
是不是客户端回传数据一定要用LinkPoke?)