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

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 46 ::
收藏到网摘: 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中。