ccidnet????

出版日期:2000-01-10 总期号:891 本年期号:03

本期导读
要闻综合
电脑工作室
市场
硬件
软件
infotimes
dde使用攻略

经乾

  dde(动态数据交换)允许应用程序之间共享数据,它在功能上类似ole,但不嵌入,即客户程序(client)和服务程序(server)是单独运行的。它们之间的会话经由一条通道(channel)来进行,整个会话过程由程序控制,不需用户进行任何干涉。

  尽管dde正逐渐被ole取代,但其作为一种应用程序之间共享数据的手段,仍然受到广泛的使用和支持。相比之下,ole服务器通过嵌入到客户程序中来为其提供服务,激活速度常常慢得让人讨厌。因此,在某些情况下ole是无法取代dde的。


  一、dde应用实例


  如何通过应用程序向word的当前光标下输入字符串?

  这一问题可以很容易用dde加以解决,实现的过程非常简单,下面以pb为例进行说明:

  设计如下图所示的窗口(w—dde),sle—1用于接收要插入字符串的word文档名,它将作为应用程序和word之间建立会话的主题。mle—1用于接收要插入的字符串。在“建立通道”的clicked事件中加入如下代码:


  channelnum=openchannel(″winword″,sle—1.text,handle(w—dde))

  if channelnum<0 then messagebox(′dde消息′,′建立通道失败′)

  “发送数据”的clicked事件中加入如下代码:

  if channelnum>0 then execremote(′[insert″′+mle—1.text+′″]′,channelnum)

  它的作用是向word发送一个insert命令,让其把mle—1中的内容插入到当前光标所在的位置。

  在“关闭通道”的clicked事件中加入如下代码:

  closechannel(channelnum)

  // 关闭dde会话通道

  close(parent)

  //关闭应用程序

  到此问题就解决了。若读者想把word文档当前选中的内容复制到应用程序的mle—1中,可在“获取数据”的clicked事件中加入如下代码:

  execremote(′[editcopy]′,channelnum)

  //命令word把当前选中内容复制到剪贴板

  mle—1.paste()//粘贴剪贴板上的数据

  事实上,通过dde可以在word文档的任何位置插入数据,下面的代码在文档头插入数据:

  setremote(′\startofdoc′,mle—1.text,channelnum)// \startofdoc为word内部标签


  二、dde编程实践


  每一个支持dde的应用程序都有一个dde别名和若干个会话主题,dde别名一般与不带exe的程序名相同,下表列出了几个常见应用程序的dde别名。建立dde通道时,要根据需求选择一个会话主题,以word为例,若要与某一个文档会话,主题就是它的文件名;若要调用系统的功能,如打开文档、改变主窗口大小等,会话主题就应选择system。弄清这些概念后,就可着手编写自己的dde应用程序了。

应用程序名 dde别名
access msaccess
excel excel
word winword
foxpro foxpro
msdev98 msdev

  1.编写dde应用程序

  下面用pb编写一个dde服务程序,利用该程序可以播放客户的声音文件,接收客户数据以及根据客户的要求改变颜色,主窗口(w—ddeserver)如下图所示:

  sle—1用于接收客户数据,矩形控件r—1用于显示颜色。为了播放声音,要先说明win32 api函数playsound:

  function long playsound (string filename,int mod,int flags ) library ″winmm.dll″


  在窗口的open事件中加入下列语句来设定并启动dde服务器:

  startserverdde(w—ddeserver, ″alexander″,″systm″,″sle—1″,″r—1″)

  其中alexander为dde别名,system为会话主题,sle—1和r—1为两个位置。客户发送数据时,会触发remotesend事件,因此在该事件中添加如下代码:

  string ddename, topic, location,color

  getdataddeorigin(ddename, topic, location)//获取dde别名、会话主题和位置

  if upper(ddename)=″alexander″ and upper(topic)=″system″ then

  choose case upper(location)

   case ″sle—1″

getdatadde (sle—1.text)//获取并显示客户转来的数据

playsound(sle—1.text,1,1)//播放客户转来的声音文件

case ″r—1″

getdatadde (color)//获取客户指定的颜色

r—1.fillcolor=long(color)//改变矩形填充颜色

  end choose

  end if

  2.测试dde应用程序

  用visual foxpro 6.0设计如下窗体来测试开发的dde服务程序。

  “打开声音文件”click中的代码为:

  channelnum = ddeinitiate(′alexander′,′system′)

  if channelnum!= -1 then

  fn=getfile(′wav′,′打开wav文件′,′确定′, 1,′打开文件′)

   =ddepoke(channelnum,′sle—1′,fn)

=ddeterminate(channelnum)

  endif

  “选择颜色”click中的代码为:


  channelnum = ddeinitiate(′alexander′,′system′)

  if channelnum!= -1 then

   color—val=getcolor()

   =ddepoke(channelnum,′r—1′,str(color—val))

   =ddeterminate(channelnum)

  endif

  测试结果:服务程序播放客户指定的声音文件,文件名显示在sle—1中;r—1的填充颜色变成客户选择的颜色。