请教一个DDE问题?
我用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个单元格的数据,怎么会这样?
问题点数:100、回复次数:5Top
1 楼rainstormmaster(暴风雨 v2.0)回复于 2005-12-04 16:55:41 得分 0
函数的声明有问题没有?还有,把你的回调函数贴出来Top
2 楼flili()回复于 2005-12-04 21:44:57 得分 0
首先感谢回贴!!!
函数已经声明,我把回调函数贴在下面:
'在模块里
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作为源的时候,收到
的是一批。
Top
3 楼WallesCai(女人之美,在于蠢得无怨无悔,男人之美,在于撒谎撒得白日见鬼)回复于 2005-12-07 23:12:09 得分 0
何不试试直接用VB的TEXT或LABEL控件来作为DDE接受呢。MSDN中就有例子,操作起来也更容易。Top
4 楼cozil(不顾一切)回复于 2005-12-08 13:30:50 得分 0
关注Top
5 楼flili()回复于 2005-12-08 19:52:45 得分 0
用VB的TEXT或LABEL控件来做确实很容易,我已经实现了,但是有些问题:
1. 作为DDE客户端时:
当设置LinkMode = 1 (自动),可能会等很久才响应。
控件不能太多。
2. 作为DDE服务端时:
控件不能太多,而我要求是10000个DDE项,相当于10000个控件,
最方便的是用Load label(i)这种方式来加载,加载慢,项目名称
不能随意定义,只能按照控件的Name属性。
Top




