请教一个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个单元格的数据,怎么会这样?



...全文
228 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
  • 打赏
  • 举报
回复
函数的声明有问题没有?还有,把你的回调函数贴出来
内容概要:本文详细介绍了利用Simulink进行变压器开路试验的电路连接配置与仿真实现方法,重点在于通过仿真手段还原实际电力系统中变压器在空载条件下的电气特性,从而深入理解其工作原理与性能表现。文章作为电力系统仿真系列研究的一部分,系统阐述了从电路模型搭建、参数设定、仿真运行到结果分析的完整流程,突出展示了MATLAB/Simulink在电力设备建模与教学科研中的强大功能与应用价值。; 适合人群:具备电力系统基础知识,熟悉MATLAB/Simulink仿真环境,从事电气工程、自动化及相关领域的研发人员,以及高年级本科生和研究生。; 使用场景及目标:①掌握变压器开路试验的基本原理与Simulink仿真建模的具体步骤;②通过仿真实验深入理解空载电流、铁芯损耗及励磁特性等关键参数的物理意义;③为后续开展变压器短路试验、暂态过程分析以及其他电力设备的仿真研究奠定理论与实践基础。; 阅读建议:建议结合Simulink软件动手实践,逐步构建并调试电路模型,重点关注各元件参数的设置方法与测量模块的应用技巧,同时推荐参考文中提及的其他相关仿真案例进行拓展学习,以全面提升对电力系统仿真实践的整体认知与操作能力。

1,488

社区成员

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

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