CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  API

请教一个DDE问题?

楼主flili()2005-12-03 23:52:00 在 VB / API 提问

 
  我用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

相关问题

  • dde
  • DDE,DDE,DDE,DDE,DDE,DDE,请知道用的进来指点一二。
  • Developer2000下的DDE
  • DDE的问题!
  • 请教 DDE
  • 关于dde
  • 谁有用过DDE?
  • 什么是DDE?(内无)
  • 关于DDE的问题
  • 请教DDE的问题

关键词

  • 控件
  • 函数
  • 连接
  • excel
  • vb
  • hszitem
  • idinst
  • hsztopic
  • ddecreatestringhandle
  • xtyp

得分解答快速导航

  • 帖主:flili

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo