安全中国首页 > 编程中心 > Delphi编程
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

利用COM技术实现外壳扩展的属性页[2]

更新时间:2008-8-5 3:07:55
责任编辑:ShellExp
热 点:

  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;

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

  filecount:=DragQueryFile(stgmedium.hGlobal, $FFFFFFFF, nil, 0);

  if filecount=1 then

  begin

    Result:=NOERROR;

    DragQueryFile(stgmedium.hGlobal, 0, szFile, SizeOf(szFile));

    FFilename:=strpas(szFile);

  end;

  ReleaseStgMedium(StgMedium);end;添加页面的操作是通过IShellPropSheetExt接口来实现的。如果属性页是和文件相关联,外壳会调用IShellPropSheetExt.AddPages给属性页添加一个页面。如果属性页同控制面板程序相关联,外壳调用IShellPropSheetExt.ReplacePage来替换页面。

  IShellPropSheetExt.AddPages方法有两个参数,lpfnAddPage是一个指向AddPropSheetPageProc回调函数的指针,回调函数用来提供要添加的页面信息给外壳。lParam是一个用户自定义的值,这里我们用它来返回给回调函数对象。

  一般的IShellPropSheetExt.AddPages方法实现步骤是:

  · 给PROPSHEETPAGE结构设定正确的值,特别是把扩展的对象引用记数变量付值给pcRefParent成员,这可以防止页面还在显示时,扩展对象被卸载。

  · 实现PropSheetPageProc回调函数来处理页面创建和销毁的情况。

  · 调用CreatePropertySheetPage函数来创建页面。

  · 调用lpfnAddPage指向的函数来来添加创建好的页面。

  function TCXPropSheet.AddPages(lpfnAddPage: TFNADDPROPSHEETPAGE;

  lParam: LPARAM): HResult;var

  PSP: TPropSheetPage;

  HPSP: HPropSheetPage;begin

  result:=E_FAIL;

  try

  psp.dwSize:=SizeOf(psp);

  psp.dwFlags:=PSP_USEREFPARENT or PSP_USETITLE or PSP_USECALLBACK;

  psp.hInstance:=hInstance;

  //这里我们使用了事先储存在wave.res中的对话框模板,模板是用delphi5自带的

  //resource workshop编辑的,使用delphi5\bin\brcc32.exe编译的。

  psp.pszTemplate:=MakeIntResource(100);

  //标题名

  psp.pszTitle:=’波文件信息’;

  //设定回调函数

  psp.pfnDlgProc:=@DialogProc;

  psp.pfnCallBack:=@PropCallback;

  //设定对象引用记数变量

  psp.pcRefParent:=@comserver.objectcount;

  //用lParam向回调函数传递对象

  psp.lParam:=integer(self);

  HPSP:=CreatePropertySheetPage(psp);

  if HPSP$#@60;$#@62;nil then begin

  if not lpfnAddPage(HPSP, lParam)then begin

  DestroyPropertySheetPage(HPSP);

  end else begin

  _addref;//增加引用记数,否则一脱离这个方法的作用域,delphi自动释放对象。

 
学习软件编程开发技术,推荐加入以下软件编程培训班:
易语言软件编程培训班(简单易学)  Delphi软件编程培训班  VC++软件编程培训班
VB软件编程培训班  JAVA高端编程就业研发班

学习网站开发制作技术,推荐加入以下网站开发培训班:
ASP.net网站开发项目实战班  ASP语言网站建设培训班

学习网络安全入侵防护技术,推荐加入以下技术培训班:
大型网络安全入侵防护班  网站脚本程序全方位安全检测班

学习网络管理、网吧运营维护技术(网管),推荐加入以下培训班:
大型网吧技术管理人才特训班  Linux网络嵌入架构工程师培训班

学习专项特殊技术,推荐加入以下专项技术培训班:
软件与游戏外挂脱壳破解班(逆向工程)  赚钱王道-网赚技能培训班  Flash动画设计师就业特训班

 
相关编程
一日一文章
 
一日一软件
一日一动画