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

来源:互联网 发布:mac无损播放器哪个好 编辑:程序博客网 时间:2024/06/05 18:46

有关动态数据交换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

原创粉丝点击