请问各位高手,DDE的主要功能是什么?他主要用在VB的那些领域?

解决方案 »

  1.   

    DDE,用来在操作系统中各程序间进行通讯用的。
      

  2.   

    以前收藏的一个文档,看后应该就能明白了。--
                   使用DDE技术,为您的应用程序增辉    上网的朋友一定都用过网络蚂蚁(Net Ants)的吧?不知你在使用过程中有没有注意过,
    那就是如果你想调动两个“蚂蚁”为您效力是不可能的--它总会把新运行的关闭。这点在VB
    中很容易实现:
        Private Sub Form_Load()
           If App.PrevInstance Then
              MsgBox "你已经运行这个应用程序了"
              End      ' 退出新运行的程序
           End If
        End Sub
        这样如果你运行这个程序后在运行它,它会弹出一个消息框并拒绝再次运行。这非常容易。
        而“蚂蚁”程序的妙处就在于:在重复运行“蚂蚁”时它不仅拒绝运行,而且能把已经运
    行的“蚂蚁”激活,这样用上面的程序就无能为力了。但事实上实现拒绝运行并激活已运行的
    程序有多种方法:    1、用FindWindow函数得到已经运行窗体的句柄(HWND),然后用SetActiveWindow等API函
           数将其激活。其缺点也很明显,那就是没法传递参数。    2、用FindWindow函数得到已运行窗体的句柄后用SendMessage的方法给窗体传送一个自定义
           消息(附带参数),然后在窗体中拦截并进行处理,但这样做要修改窗体的标准消息处理
           程序,用在VC,BC或DELPHI编写的程序中还行,但在VB中工作量太大,并且容易发生“一
           般保护行错误”使VB崩溃,不太可取(当然,如果你有足够的信心和不怕崩溃的精神,也
           可以试一下 ^_^ )。    3、使用DDE技术。    所谓DDE技术,就是动态数据交换技术。也许你很奇怪,这与本文所讨论的内容有什么相干的?
    且听我慢慢讲来。
        为了实现拒绝运行并把已经运行的程序激活并实现各种功能,我们可以先用本文开头提到的方
    法,检测一下程序有没有被运行过,如果没有,就正常运行,如果已经被运行过,就打通与它的
    DDE通道,传给它一个(或一些)数据,然后由已经运行的程序对数据进行处理,再去实现各种
    “意想不到”的功能,这时也许就有人对这你的程序喊:“酷、酷……”  ^_^
        好了,耳听为虚,眼见为实,下面让我们动点真格的。    打开VB,新建一个工程,选择菜单中的“工程->工程1 属性”,把工程名称改为“P1”(我爱
    偷懒,能短则短 ^_^ ),把已有的一个窗体的“LinkTopic”属性改为“FormDDE”,把“LinkMode”
    属性改为“1 - Source”,添加一个PictureBox控件作为DDE执行控件,命名为picDDE。然后添加一个
    TextBox控件,命名为“txtInfo”,并把“MultiLine”属性设置为“True”,以便显示多行文本,作为
    消息显示控件。最后在窗体代码区输入以下代码:
    Const COMMANDLINE = "CommandLine="       '  还是为了省事,定义一个常量Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
    Static lngCount As Long
    Dim Info As StringInfo = txtInfo.Text     '      保留原有信息Select Case CmdStr         '    CmdStr 是DDE程序传送过来的参数
      Case "Max"
        Me.WindowState = 2
        Info = Info + vbNewLine + "窗体已被最大化"
      Case "ShowTime"
        Info = Info + vbNewLine + "最后一次运行这个程序的时间是:" + Str(Now)
      Case "Count"
        lngCount = lngCount + 1
        Info = Info + vbNewLine + "你已经第" + Str(lngCount) + "次重复调用这个程序。" _
                + vbNewLine + "但怕您不多给工资,所以只运行了一个 ^_^"
    End SelectIf Left(CmdStr, Len(COMMANDLINE)) = COMMANDLINE Then
      Info = Info + vbNewLine + "新程序曾以命令行形式运行" + vbNewLine + "命令行为:" _
             + vbNewLine + Right(CmdStr, Len(CmdStr) - Len(COMMANDLINE))
    End IftxtInfo.Text = Info     '    把信息显示出来Cancel = False     
    End Sub
    Private Sub LinkAndSendMessage(ByVal Msg As String)
    Dim t As Long
    picDDE.LinkMode = 0               '--
    picDDE.LinkTopic = "P1|FormDDE"   '  |______连接DDE程序并发送数据/参数
    picDDE.LinkMode = 2               '  |      “|”为管道符,是“退格键”旁边的竖线,
    picDDE.LinkExecute Msg            '--        不是字母或数字!t = picDDE.LinkTimeout     '--
    picDDE.LinkTimeout = 1     '  |______终止DDE通道。当然,也可以用别的方法
    picDDE.LinkMode = 0        '  |      这里用的是超时强制终止的方法
    picDDE.LinkTimeout = t     '--
    End Sub
    Private Sub Form_Load()
    If App.PrevInstance Then     ' 程序是否已经运行  Me.LinkTopic = ""          ' 这两行用于清除新运行的程序的DDE服务器属性,
      Me.LinkMode = 0            ' 否则在连接DDE程序时会出乱子的  LinkAndSendMessage "Max"          '--
      LinkAndSendMessage "Count"        '  |-----连接DDE接受程序并传送数据/参数
      LinkAndSendMessage "ShowTime"     '--  If Command <> "" Then             ' 如果有命令行参数,就传递过去
         LinkAndSendMessage COMMANDLINE + Command    
      End If
      End                               '  结束新程序的运行
    End If
    End Sub测试一下:
        把工程“P1”编译成EXE文件(设名称为 P1.EXE )
        1、打开“我的电脑”,找到 P1.EXE 并执行。可以看到程序正常运行了。
        2、再运行一次,这次新程序没有运行成功,而原来运行的程序却被最大化了,而且文本框中有以下
           字符: 窗体已被最大化
     你已经第 1次重复调用这个程序。
     但怕您不多给工资,所以只运行了一个 ^_^
     最后一次运行这个程序的时间是:00-2-6 7:11:01    3、打开 MS-DOS方式 ,用命令行方式再次运行程序,如 “P1 How Are You?”
           这时原来运行的程序文本框中又多了几行字: 窗体已被最大化
     你已经第 2次重复调用这个程序。
     但怕您不多给工资,所以只运行了一个 ^_^
     最后一次运行这个程序的时间是:00-2-6 7:14:32
     新程序曾以命令行形式运行
     命令行为:
     How Are You?OK,运行完全正确,然后你就可以把它应用的你的程序中了。当然,这只是一些个人心得,如有疏漏之出,还请各位大虾指正。  
     对该文的评论  
          dulo123 (2001-11-27 14:54:28)  多谢,我正需要! 
     
          Chice_wxg (2001-8-4 17:28:26)  是啊,DDE是老东东了,Windows3.0的产物,呵呵。 不过这是我很久以前写的文章,当时投稿没发表,就一直存在硬盘里,最近终于发现了,也不想再投稿。拿出来给大家做点贡献吧! ^_^ 
     
          BCB (2001-8-4 8:06:08)  dde有点过时,可以换其它办法 
      

  3.   

    以上原作者:
    Chice_wxg
    http://www.yestar2000.com/TechCenter/307/TC_9404.htm (原来CSDN上有的,现在找不到了)另参考:
    http://search.csdn.net/Expert/topic/943/943913.xml?temp=.4881861
      

  4.   

    简单的说,是WINDOWS下的一种数据交换方式,其实它的本质和剪贴板是一样的,都是利用了WINDOWS的系统提供的公共存储空间。所以用这个功能可以作到不同程序之间的通讯。并且因为这种方式极为简单,所以使用也很方便,不象TCP那么复杂。比如,你可以用VB中的LABEL控件或TEXT控件来作一个这样的程序,完全不用一个API去控制另一个程序(如EXCEL)。
      

  5.   

    我写一段代码,让程序把一个MSFLEXGRID网格中的内容传到EXCEL中:新建一个工程,放一个LABEL(Label1),一个MSFLEXGRID (Grid1),一个按钮 (Command1)Sub form_load()
    Dim I As Long
    Dim L As Long
    Grid1.Rows = 10
    Grid1.Cols = 10
    For I = 0 To 9
       For L = 0 To 9
          Grid1.TextMatrix(I, L) = I & L   '随便弄点东西放在表格里
       Next
    Next
    Shell "C:\Program Files\Microsoft Office\Office\excel.exe"
    End SubSub Command1_Click() '主要看这段代码
    Dim Str As String
    Dim I As Long
    Dim L As LongLabel1.LinkTopic = "excel.exe|book1"  '指定要联结的程序
    Label1.LinkMode = 2   '指定传送模式为手动发送
    For I = 1 To Grid1.Cols
      For L = 1 To Grid1.Rows
        Str = "r" & L & "c" & I
        'excel中控制位置使用RnCm来表示行列的,R表示行,C表示列,n和m都是数字    Label1.LinkItem = Str
        '指明DDE要发送数据到EXCEL的哪一行哪一列    Label1.Caption = Grid1.TextMatrix(I - 1, L - 1)
        '把要发送的数据放进LABEL    Label1.LinkPoke  '发送数据
      Next
    Next
    End Sub运行一下,等EXCEL出来之后,按一下按钮看看。是否数据已经传过去了呢?
    如果你以前还用其他方法做过相同的事的话,那么再对比一下这个,是否这个更简单呢?连引用office的对象都不用。