当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 如何使用.net操作ddeml?

ASP.NET
Asp.net 时间操作基类(支持短日期,长日期,时间差)
asp.net 获取机器硬件信息(cpu频率、磁盘可用空间、内存容量等)
asp.net 数据库备份还原(sqlserver+access)
Asp.Net 数据操作类(附通用数据基类)
Asp.net 弹出对话框基类(输出alet警告框)
Asp.net 文件上传类(取得文件后缀名,保存文件,加入文字水印)
Asp.net Socket客户端(远程发送和接收数据)
Asp.net 字符串操作基类(安全,替换,分解等)
Asp.Net数据输出到EXCEL表格中
asp.net Gridview里添加汇总行
asp.net UpdatePanel的简单用法
asp.net ajaxControlToolkit FilteredTextBoxExtender的简单用法
this connector is disabled错误的解决方法
sql事务应用积累
asp.net Page.Controls对象(找到所有服务器控件)
在asp.NET中字符串替换的五种方法
ASP.NET缓存方法分析和实践示例代码
asp.net 在DNN模块开发中遇到的resx怪问题
ASP.NET State service状态服务的问题解决方法
asp.net 结合mysql存储过程进行分页代码

ASP.NET 中的 如何使用.net操作ddeml?


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 179 ::
收藏到网摘: n/a

dde是为了实现进程间动态的数据交换,适合于两个程序之间的数据交换频率较大的情况,也就是交换实时数据。ddeml类库已经实现了对dde的包装,并且操作起来很方便。本人使用的便是ddeml库。

我的任务是使用dde来将实时数据发送的excel,首先创建一个dde服务器(如:serv1),注册几个主题(如: topic1)。然后打开excel,选择一个cell单元,往里面输入=serv1|topic1!'aaaaa',dde服务器就会进行响应,根据主题和item读取一个及时数据,返回到当前的单元格。这样一来,我就可以定制一张excel表格,里面放上我想要的数据,这些数据始终是最新的。

实现的步骤如下

1、导入所有所需的ddeml的api函数和常量

2、初始化dde对象

3、注册一个服务,并申请几个主题(topic)字符串

4、编写回调函数中的消息处理程序

5、编写相应消息进行取值的部分

要实现这一点,需要克服几个技术问题

 1、受委托的回调函数的使用方法
 2、数据回传到excel中的格式
 3、消息处理过程
 
首先讲述问题3,
 当用户往excel敲进公式时,ddeserver就会有响应,它会记下用户公式的各部分。
 然后去查找实时信息,返回一个值,这个值就是要添入到当前cell中的值。
 取到值后,调用ddeml的DdePostAdvise函数,它会激发回调函数的XTYP_ADVREQ消息
 该消息中调用DdeCreateDataHandle函数,把这个新的值放回对应的cell中。
 
 注意:DdePostAdvise的调用并不一定马上触发XTYP_ADVREQ消息,该函数内部使用PostMessage,
 而不是sendMessage,系统会收集一些XTYP_ADVREQ消息一并处理,这时你就要区分那个cell对应那个值了。这个问题不难解决,你自己想办法吧。
 
讲述问题1,
 dde初始化需要调用一个接受委托的回调函数
     Public Declare Function DdeInitialize Lib "user32" Alias "DdeInitializeA" (ByRef pidInst As Integer, ByVal pfnCallback As DDECallBackDelegate, ByVal afCmd As Integer, ByVal ulRes As Integer) As Short
  只要你试过一遍,就会觉得它的调用实际上很简单,这方面的资料也很多。关键就是回调函数声明的形式和定义的形式必须一致,否则将不能调用。
     Private _DDECallBack As DDEML.DDECallBackDelegate = Nothing
 _DDECallBack = New DDEML.DDECallBackDelegate(AddressOf DDECallBack)
        Dim ddeinst As Integer
        ddeinst = DDEML.DdeInitialize(g_lInstID, _DDECallBack, DDEML.APPCLASS_STANDARD, 0)

  dde初始化函数被调用之后,当前进程就会把dde的消息添加到消息循环中,如果收到这些消息,就会调用这个回调函数DDECallBack来处理。
 
第2个问题
 要想让cell接受你的值,随便传一个字符串它是不接受的,你要使用xltable格式传递,当然,如果你做的是dde客户端,什么格式也就无所谓了。(这时我经过大量的实验得到的,如果你有好办法,就请分享一下。)
10 00 04 00 01 00 03 00
 tdtTable, cb=4, rows=1, columns=3
 02 00 10 00
 tdtString, cb=16
 04 45 61 73 74
 cch=4, East (tdtString continued)
 04 57 65 73 74
 cch=4, West (tdtString continued)
 05 4e 6f 72 74 68
 cch=5, North (tdtString continued)

我的最后问题是tdtTable不能填写多个cell,以上格式是微软文档中的,实际上不行,不知道为什么。把数据写在第一个td中。