网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > DELPHI > 正文
利用COM技术实现外壳扩展的属性页
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/12
下载{$ArticleTitle}原创论文样式

  当用户在资源管理器中调用右键菜单时,会显示一个"属性"菜单项,点击属性菜单项会显示一个属性页,用户可以获得甚至修改文件信息。我们可以定制属性页通过实现属性页扩展。如下图所示,本文实现了一个显示wave(波形)文件的信息如声道数等信息的属性页扩展。

  属性页扩展通常是同某类文件相关联的来实现同之相关的操作和信息显示,另外可以同驱动器相关联,我们还可以用属性页扩展来替换控制面板程序的属性页。象其他外壳扩展程序一样,属性页扩展也是以动态连接库形式实现的进程内COM对象。它除了IUnknown接口外还要实现IShellExtInit和IShellPropSheetExt接口。

  建立同文件关联的属性页扩展

  首先,我们用命令File|New,创建一个ActiveX Library,然后新建一个COM Object,实现的接口为IShellExtInit和IShellPropSheetExt。

  同文件建立关联需要注册属性页,要在注册表中同相应文件对应的表项下添加Shellex/PropertySheetHandlers子键,每增加一个页面就需要注册一个表项,最大可以添加的页面数是24,我们可以用一个扩展实现多个页面。这里我们通过从TComObjectFactory继承类实现的UpdateRegistry实现了注册

  

  type

    TCXPropSheetFactory=class(TComObjectFactory)

   public

    procedure UpdateRegistry(Register: Boolean); override;

   end;

  procedure TCXPropSheetFactory.UpdateRegistry(Register: Boolean);var

    ClassID: string;

    Str,KeyName : string;begin

    inherited UpdateRegistry(Register);

  if Register then

  begin

    ClassID:=GUIDToString(Class_CXPropSheet);

    with TRegistry.Create do

    try

    RootKey:=HKEY_CLASSES_ROOT;

    OpenKey(’\.wav’,TRUE);

    KeyName := ReadString(’’);

   if Keyname = ’’ then

   begin

    WriteString(’’,’WaveFile’);

    OpenKey(’\.wav’,TRUE);

    KeyName := ReadString(’’);

   end;

    OpenKey(’\’+KeyName+’\shellex\Propert eetHandlers\Wav’,TRUE);

    WriteString(’’,Classid);

    finally

    Free;

  end;

  if(Win32Platform=VER_PLATFORM_WIN32_NT)then

  begin

    with TRegistry.Create do

    try

    RootKey:=HKEY_LOCAL_MACHINE;

    OpenKey(’SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions’, True);

    OpenKey(’Approved’, True);

    WriteString(ClassID, ’Wave File Property Sheet’);

    finally

    Free;

    end;

   end;

  end

  else

  删除注册表项.. end;初始化扩展是通过IShellExtInit实现的,当外壳调用IShellExtInit.Initialize时,它传递一个数据对象包含来文件对应的目录的PIDL标识符。Initialize方法需要从数据对象中提取文件名,并把文件名和PIDL标识符保存起来为了以后使用。

  

  function TCXPropSheet.SEIInitialize(pidlFolder: PItemIDList;

    lpdobj: IDataObject; hKeyProgID: HKEY): HResult;

  var

    StgMedium: TStgMedium;

    FormatEtc: TFormatEtc;

    szFile: array[0..MAX_PATH+1]of Char;

    filecount: integer;begin

    Result:=E_FAIL;

  if(lpdobj=nil)then

  begin

    Result:=E_INVALIDARG;

    messagebox(0, ’1’, ’错误’, mb_ok);

    Exit;

  end;

  with FormatEtc do

  begin

    cfFormat:=CF_HDROP;

    ptd:=nil;

    dwAspect:=DVASPECT_CONTENT;

    lindex:=-1;

 

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号