| 网站首页 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛 |
 
 
 
您现在的位置: 编程中国 >> 技术教程 >> 开发语言 >> VC++ >> VC技术资料 >> 正文
  ►  利用COM技术实现外壳扩展的属性页
利用COM技术实现外壳扩展的属性页
作者:不详    阅读人次:……    文章来源:不详    发布时间:2007-9-1    网友评论()条
 

  当用户在资源管理器中调用右键菜单时,会显示一个"属性"菜单项,点击属性菜单项会显示一个属性页,用户可以获得甚至修改文件信息。我们可以定制属性页通过实现属性页扩展。如下图所示,本文实现了一个显示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;

    tymed:=TYMED_HGLOBAL;

  end;

  Result:=lpdobj.GetData(FormatEtc, StgMedium);

  if Failed(Result)then

  Exit;

  //如果只有一个文件被选中,获得文件名并保存。

[1] [2] 下一页

 

 
文章录入:编辑01    责任编辑:编辑01 
  • 上一篇文章:

  • 下一篇文章:

  •  
    相关文章
    原创地带
    24小时热门帖子