有关动态数据交换DDE、注册表和文件关联的片语只言(转载)

一、动态数据交换(Dynamic Data Exchange,简称DDE)

  • DDE协议定义了一组消息及其使用规则,借助共享内存机制,通过应用程序窗口之间的消息交换间接实现了应用程序间的数据交换。
  • 客户端(Client)、服务器(Server)和会话(Conversation)
    参与DDE消息交换的两个应用程序构成了一个DDE会话的两个主体,会话发起方称作客户端,会话响应方称作服务器;一个应用程序可以同时参与多个DDE会话,它在每个会话中所扮演的角色不受任何限制,既可以是服务器也可以是客户端。
    DDE会话发生在两个窗口之间,这两个窗口分别隶属于参与会话的两个应用程序;窗口既可以是应用程序的主窗口,也可以是MDI类应用程序的某个文档的窗口,还可以是专门用来处理DDE消息的隐藏性窗口。
    DDE会话由参与会话的两个窗口的句柄组成的句柄对标识, 无论何时两个窗口之间只能存在一个DDE会话。
  • 应用(Application)、主题(Topic)和数据项(Item)
    DDE协议采用三级层次结构来标识被交换的数据单元,按照从高到低的顺序这三层分别是应用、主题和数据项。应用名,也被称作服务名,通常情况下人们就使用 扮演服务器角色的应用程序的名称作为应用(服务)名;而主题名通常表示待交换数据的一个总体类属,是一种逻辑分组名称;而数据项名就具体指出了某个数据单 元的确切含义和用途;需要注意的是应用名、主题名和数据项名都是用来标识数据的逻辑名称,使用什么样的名字完全取决于服务端应用程序的具体实现,而和 DDE协议本身没有任何关系。
    一般来讲,一个扮演服务器角色的应用程序只提供一个应用/服务名,而按照数据的用途和类型的不同,往往会提供多个主题名,而每个主题名下又会包含多个数据 项;两个应用程序间要建立DDE会话,客户端往往需要提供应用名和主题名,应用名指出了会话的目标程序,主题名则决定了在该会话中可以交换的数据项的范 围,应用名和主题名在会话初始由双方协商确定,并且在该会话存续期间不可改变,如果你想交换一个不属于当前主题的数据项,对不起,你必须用新主题重新建立 一个新会话。
  • DDE协议比较老旧,微软也不再鼓励使用,如果没有DDE服务程序的开发经验的话,有些概念理解起来确实不太容易,为了理解上的方便,不妨把DDE架构与互联网架构作一个简单的类比,虽不严格,却也颇为神似:
  • 总体来说,DDE协议是一款设计精巧的、轻量级的进程间通讯协议,之所以被微软打入冷宫,原因可能有以下三点:
    1.网络延展性不好。由于实现机制本身的限制,DDE协议对于跨系统的进程间通信的支持不是很理想,虽然也有了Network DDE,但其本质是通过代理来实现的;
    2.设计精巧,非常节省资源,导致Intel颇多抱怨;
    3.工作顺利,不喜欢崩溃,不符合微软的风格和口味。
    因此,虽然不再受宠,但是如果你正在寻找一种系统内的进程间通讯机制的话,DDE还是很值得考虑一下的。
  • 参考:http://msdn.microsoft.com/en-us/library/ms674583(VS.85).aspx

二、注册表(Registry)

  • 键名(Key Name)由除反斜线\之外的可打印ASCII字符组成,而值名(Value Name)则不受此限制,可以使用各种语言的各种字符;键名不区分大小写。
  • 注册表保存在蜂巢文件(Hive Files)中,而蜂巢文件在文件系统中的位置和名称可以从注册表的下列子键HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist中取得。
  • Value Data中所包含的字符串类型数据(REG_SZ, REG_MULTI_SZ, REG_EXPAND_SZ)既可能是Unicode字符串,也可能是ANSI字符串。注意,ANSI字符串可不仅仅是指英文字符串,ANSI收录了几乎 所有的主流编码方案(称作代码页),当然也包括简体中文的GBK编码方案(CP936),因此GBK字符串也属于ANSI字符串。
  • HKEY_CLASSES_ROOT(HKCR)是HKEY_LOCAL_MACHINE\Software\Classes (针对本机所有用户)和HKEY_CURRENT_USER\Software\Classes (针对特定的交互式用户)的合并视图,合并的原则是用户设置优先,使用的原则是尽量用于读取、读取尽量使用,如果要进行写入操作的话,最好明确指明HKEY_LOCAL_MACHINE\Software\Classes或 HKEY_CURRENT_USER\Software\Classes路径。使用HKEY_CLASSES_ROOT进行读取操作,一方面为应用软件提 供了在老旧的操作系统上的兼容性,另一方面也简化了在新系统上获取用户个性化设置的流程,可谓一举两得。
  • 参考:http://msdn.microsoft.com/en-us/library/ms724871(VS.85).aspx

三、文件关联(File Associations)

  • 参数扩展变量%0-%9及%*在批处理文件和注册表中的含义略有不同。
    批处理文件:
    %0代表要执行的命令(也就是批处理文件)本身
    %1-%9代表对应的命令行参数
    %*代表所有命令行参数,注意不包括命令本身%0
    注册表中定义shell动作时:
    %1代表你要启动的文件(比如用鼠标双击的文件)
    %2-%9代表对应的后续的参数(比如双击了带有参数的快捷方式)
    %*代表所有的后续参数,注意不包括你要启动的文件本身%1
    %0在作为参数出现时与%1同意,作为命令出现时其含义未定义
  • 间接字符串(Indirect String)
    格式:@[Path\]Filename,-ResourceID
    含义:从[Path\]Filename指定的模块中抽取串资源ID为ResourceID的字符串
    样例:@%SystemRoot%\notepad.exe,-469,就是指从notepad.exe中抽取串资源ID为469的字符串,我的系统上该串就是"Text Document"。
  • 缺省动作
    文件关联为每种文件类型都提供了一个缺省动作,也就是指当用户双击该类型文件时系统应该采取的动作,该动作在ProgID的Shell键的Default值中被指明,如果该值为空,对大多数文件类型来讲,缺省动作常常就是Open动作。

  • Shell处理动作(Verb)的方式有三种,按照优先级从高到低的顺序排列如下:
    1.使用COM和IDropTarget,通过定义DropTarget键实现;
    2.使用动态数据交换DDE,通过定义ddeexec键实现;
    3.使用命令行调用,通过定义command键实现;
    如果一个动作(Verb)同时提供了三种实现方式,那么Shell会首先尝试优先级高的方式,只有高优先级方式失败,才会依次选择次优先级的方式。
    出于使用方面的考虑,下面仅对如何实现DDE方式做一些详细的解释:
    首先,在verb下创建子键ddeexec,并将DDE命令字符串填入其Default值中。所谓命令字符串实际上就是需要通过 WM_DDE_EXECUTE消息发送给服务器程序并要求其执行的单个或多个命令组成的字符串,具体所支持的命令集及其格式完全取决于服务器程序的具体实 现,常见格式及语法可参考下面的连接。
    其次,为了对DDE会话进行更好的控制,可以在ddeexec键下创建以下可选子键:
    Application子键: 其缺省值应设置为DDE会话的应用/服务名,如果该子键不存在或者其缺省值为空,那么就使用verb\command的缺省值作为该会话的应用/服务名;
    Topic子键:其缺省值应设置为DDE会话的主题名,如果该子键不存在或者其缺省值为空,那么就使用System作为该会话的主题名;
    ifexec子键:其Default值中填入的也是DDE命令字符串,其含义与ddeexec缺省值中包含的命令字符串完全相同,只是使用场合不同。正常情况下,如果首次会话发起请求就成功建立会话的话,那么ddeexec的缺省命令字符串被使用,如果首次会话失败(通常是由于扮演服务器角色的应用程序尚未启动),则verb/command的缺省值所指向的应用程序将被启动,这时如果ifexec的缺省值不为空的话,则该命令字符串将被发往服务器程序,如果ifexec的缺省值为空或者该键根本就不存在的话,则发往服务器程序的仍将是ddeexec的缺省值所包含的命令字符串。
  • 扩展建新文件(New)子菜单
    为了在建新文件(New)子菜单中添加对某一文件类型的支持,需要找到以该类型文件的扩展名命名的注册表键(如.txt),添加ShellNew子键,并为ShellNew子键添加一个或多个如下值项(Value),以指明新文件的创建方法:
    Command REG_SZ      指定一个新文件向导程序;
    Data REG_BINARY      新文件预包含的数据;
    FileName REG_SZ       新文件的复制蓝本,忽略Data值;
    NullFile       建空文件,忽略Data值和FileName值;
    样例:
    [HKEY_CLASSES_ROOT\.txt\ShellNew]
    "NullFile"=""
  • 文件关联的另一种途径:
    除了通过在HKEY_CLASSES_ROOT中为文件扩展名设置ProgID的方法外,还可以通过在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer \FileExts中为文件扩展名设置Application的方式实现文件类型及其处理程序的关联,为了方便我们把后者简称为Application关 联方式,把前者称为ProgID关联方式。虽然对用户来说二者的作用差不多,但实际上它们之间还是有些区别的: Application关联方式是对用户使用习惯的一种记录,是根据用户在Explorer中打开Open With对话框时所作的选择而自动调整相应设置的(当然也可通过修改注册表的方法进行手工调整),是用户相关的,也就是说对每个用户来说其 Application关联方式的设置都可能是不同的;另外,Application关联方式的优先级更高一些,同样的设置项目,起作用的应该是在 Application关联方式中设定的值。
  • 参考:http://msdn.microsoft.com/en-us/library/cc147473(VS.85).aspx
    http://msdn.microsoft.com/en-us/library/cc144101(VS.85).aspx#new
    http://msdn.microsoft.com/en-us/library/ms997515.aspx

    (本文来自:http://hi.baidu.com/smileinsilence/blog/item/9b05d14aeecba42909f7efc7.html

有关动态数据交换DDE、注册表和文件关联(转载)相关推荐

  1. 注册表的文件关联及应用

    喜欢使用Windows右键快捷菜单的朋友可能知道,当你选择了一个文件(或者是文件夹或是系统图标)再单击鼠标右键,系统就会弹出一个菜单,菜单上面的各种"功能"(或称"操作& ...

  2. 关于win7注册表中文件关联应用程序的规则

    最近在做一个关于应用程序和文件图标的工具,过程中需要了解windows如何给文件选择展示图标和默认打开方式的问题,各种论坛上有关资料查了很多,但是自己一旦尝试过后就会发现所讲的都很表面,不能代表win ...

  3. 利用注册表修改文件关联

    最近在看注册表方面的东西.正巧醒哥回来了,让我做个修改文件关联的程序.具体用什么方法实现,不用管,只要能实现就可以了. 那就用注册表来实现好了. 那么利用注册表的话有几种方法可以修改关联方式呢? 首先 ...

  4. 注册表“.REG”文件完全攻略

    我们平时对注册表的修改操作大多是通过注册表编辑器Regedit来实现的,然而有一天,你登录了某个网站以后,便发现注册表编辑器已经被禁止使用了,怎么办?最简单也是最方便而且不需要任何工具的办法,那就是使 ...

  5. Windows注册表脚本文件(简介、添加、修改、删除)

    简介 我们平时大多采用Regedit注册表编辑器来实现对注册表的修改操作,但是这种手工操作费时费力,当你要对多台PC统一修改注册表时,就要怨念了.并且在某些情况下,如果注册表编辑器被禁用了,那么这种方 ...

  6. windows 注册表脚本文件 添加 修改 删除 简介

    目录 1. 简介 2. 创建REG文件 3. REG语法 3.1 基本语法 3.2 删除操作语法 3.3 重命名操作语法 4. 编辑REG文件 5. 补充知识 1. 简介 我们平时大多采用Regedi ...

  7. maya2020卸载不干净_MAYA 卸载不干净,怎么完全彻底删除清理干净MAYA各种残留注册表和文件?...

    MAYA卸载工具,完全彻底删除干净MAYA各种残留注册表和文件.MAYA安装失败,怎么完全彻底删除清理干净MAYA各种残留注册表和文件呢?有些同学想把MAYA重新安装,但是MAYA安装失败显示失败,有 ...

  8. win10如何删除注册表残留文件

    win10如何删除注册表残留文件?下面一起来看看如何操作吧. 1.按下"win+r"打开运行,输入"regedit",点击"确定"; 2.依 ...

  9. axure 彻底删除lib_【AutoCAD 卸载工具,完全彻底删除清理干净AutoCAD各种残留注册表和文件】...

    AutoCAD卸载工具,完全彻底删除干净AutoCAD各种残留注册表和文件.AutoCAD安装失败,怎么完全彻底删除清理干净AutoCAD各种残留注册表和文件呢?有些同学想把AutoCAD重新安装,但 ...

最新文章

  1. 云计算入门学习资料,linux云计算学习大纲
  2. gdb加载python_gdb加载python脚本的方法
  3. docker与jenkins学习
  4. 在 .NET 中加载椭圆曲线 (EC) 密钥
  5. python 字符串分割_如何使用python语言split方法对不同字符串分割
  6. Python一题三解:查找总分等于特定值的同学成绩
  7. liunx搭建sftp文件服务器,Centos7搭建sftp服务器
  8. 编程语言python怎么读-Python之编程基础(编程语言分类)
  9. 排列:计算1!+2*2!+3*3!+...+n*n!
  10. 在openGL中绘制图形
  11. java-Aspose.Words的使用(根据模板自动生成Office文档)
  12. Windows 7集成IE11(离线安装包、补丁)
  13. 偏微分方程数值解法pdf_数值模拟偏微分方程的三种方法:FDM、FEM及FVM
  14. Connect Four四子棋c++程序 - 显示窗口(0)
  15. oracle图书操作、sql语句查询+授权、视图、索引、表操作
  16. C++程序设计原理与实践 习题答案 第二十六章 第26章习题答案
  17. 跨国项目要注意时区问题
  18. message: Content type 'multipart/form-data;boundary=----WebKitFormBoundaryksbSBUwTCB6eHI3j;charse
  19. 思科模拟器服务器http配置文件,在思科模拟器上通过TFTP拷贝路由器的配置文件到本地...
  20. 关于显著性检验,有你想要的!

热门文章

  1. 【高级篇 / SNMP】(7.0) ❀ 04. PRTG 监控 FortiGate 状态 (下) ❀ FortiGate 防火墙
  2. 【Ap AutoSAR入门与实战开发02】-【Ap_s2s模块01】: s2s的背景
  3. 基金理财——如何卖出基金
  4. STM32 f_getfree函数读取sd卡一直不返回的解决方法
  5. INPHO常见问题处理之Orthovista
  6. 事业单位计算机类专技岗职称,事业单位,专技岗晋升容易吗?
  7. 椅子能在不平的地面上放稳吗
  8. 解决在线倍速播放视频
  9. libGDX:灯光效果实现一(实现一个点光源)
  10. 微信小程序支付流程=>实现按年支付和按月支付