请教一个DDE问题?

flili 2005-12-03 11:52:00

我用API做一个DDE客户端,连接到Excel:
1. 首先建立会话
Call DdeInitialize(m_idInst, AddressOf DdeCallback, APPCMD_CLIENTONLY, 0)
m_hszServer = DdeCreateStringHandle(m_idInst, "excel", 0)
m_hszTopic = DdeCreateStringHandle(m_idInst, "sheet1", 0)
m_hConv = DdeConnect(m_idInst, m_hszServer, m_hszTopic, ByVal 0&)
2. 热连接到3个单元格
m_hszItem(0) = DdeCreateStringHandle(m_idInst, "R1C1", 0)
m_hszItem(1) = DdeCreateStringHandle(m_idInst, "R2C1", 0)
m_hszItem(2) = DdeCreateStringHandle(m_idInst, "R3C1", 0)
For i = 0 To 2
Call DdeClientTransaction(ByVal 0&, 0, m_hConv, m_hszItem(i), CF_TEXT, XTYP_ADVSTART, 0, 0)
Next
3. 测试DDE热连接,成功

问题:
在DDE回调函数里用“Case XTYP_ADVDATA, XTYP_XACT_COMPLETE”来获得源更新的数据,
可是,当3个单元格中只有一个改变值时,都会收到3个单元格的数据,怎么会这样?



...全文
190 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
flili 2005-12-08
  • 打赏
  • 举报
回复

用VB的TEXT或LABEL控件来做确实很容易,我已经实现了,但是有些问题:

1. 作为DDE客户端时:
当设置LinkMode = 1 (自动),可能会等很久才响应。
控件不能太多。

2. 作为DDE服务端时:
控件不能太多,而我要求是10000个DDE项,相当于10000个控件,
最方便的是用Load label(i)这种方式来加载,加载慢,项目名称
不能随意定义,只能按照控件的Name属性。
cozil 2005-12-08
  • 打赏
  • 举报
回复
关注
熊孩子开学喽 2005-12-07
  • 打赏
  • 举报
回复
何不试试直接用VB的TEXT或LABEL控件来作为DDE接受呢。MSDN中就有例子,操作起来也更容易。
flili 2005-12-04
  • 打赏
  • 举报
回复

首先感谢回贴!!!

函数已经声明,我把回调函数贴在下面:

'在模块里
Function DdeCallback(ByVal uType As Long, ByVal uFmt As Long, ByVal hConv As Long, ByVal hszTopic As Long, ByVal hszItem As Long, ByVal hData As Long, ByVal dwData1 As Long, ByVal dwData2 As Long) As Long
DdeCallback = Form1.AppDdeCallback(uType, uFmt, hConv, hszTopic, hszItem, hData, dwData1, dwData2)
End Function

'在窗体Form1里
Function AppDdeCallback(ByVal wType As Long, ByVal wFmt As Long, ByVal hConv As Long, ByVal hszTopic As Long, ByVal hszItem As Long, ByVal hData As Long, ByVal lData1 As Long, ByVal lData2 As Long) As Long
Dim arr() As Byte
Dim i As Long
Dim j As Long
Dim s As String

AppDdeCallback = 0

Select Case wType

Case XTYP_ADVDATA, XTYP_XACT_COMPLETE

For i = 1 To UBound(m_hszItem) '因为单元格最小为1,所以从1开始
If hszItem = m_hszItem(i) Then
j = DdeGetData(hData, ByVal 0&, 0, 0)
If j > 0 Then
ReDim arr(j)
DdeGetData hData, arr(0), j, 0
s = StrConv(arr, vbUnicode)
s = Left$(s, Len(s) - 4) '这一行是针对excel,去掉vbcrlf和两个chr(0)
If s <> "" Then lstMsg.AddItem s
Exit For
End If
End If
Next
AppDdeCallback = DDE_FACK
Case Else

End Select
End Function


还有一个要补充,我用VB专门做了一个有三个text控件的DDE源,用以上代码连接,
每改一个控件的值时只收到对应控件的值,而如果是excel作为源的时候,收到
的是一批。

rainstormmaster 2005-12-04
  • 打赏
  • 举报
回复
函数的声明有问题没有?还有,把你的回调函数贴出来

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧