随笔 - 2146  文章 - 19 评论 - 11846 阅读 - 1267万


手头的程序需要修改注册表, 以让当前程序成为某格式的默认打开程序并关联图标; Vista 之后需要管理员权限才能操作注册表, 很麻烦, 所以有了下面的尝试.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses System.IOUtils, Winapi.ShellAPI, Winapi.ShlObj; //RegApp 函数用到的单元

//关联默认程序的函数
procedure RegApp(const aExt, aAppName, aAppPath: string);
const
  nRegFmt = 'Windows Registry Editor Version 5.00'        + sLineBreak +
            '[HKEY_CLASSES_ROOT\%0:s]'                    + sLineBreak +
            '@="%1:s"'                                    + sLineBreak +
            '[HKEY_CLASSES_ROOT\%1:s\DefaultIcon]'        + sLineBreak +
            '@="%2:s,0"'                                  + sLineBreak +
            '[HKEY_CLASSES_ROOT\%1:s\shell]'              + sLineBreak +
            '[HKEY_CLASSES_ROOT\%1:s\shell\open]'         + sLineBreak +
            '[HKEY_CLASSES_ROOT\%1:s\shell\open\command]' + sLineBreak +
            '@="%3:s"';
var
  RegStr: string;
  str3, str4: string;
  RegTmpFile: string;
begin
  str3 := aAppPath.Replace('\', '\\');
  str4 := Format('"%s" "%%1"', [str3]).Replace('"', '\"');
  RegStr := Format(nRegFmt, [aExt, aAppName, str3, str4]);
  RegTmpFile := TPath.GetTempPath + 'RegTmp.reg';
  with TStringList.Create do begin
    Text := RegStr;
    SaveToFile(RegTmpFile);
    Free;
  end;
  ShellExecute(0, nil, PChar(RegTmpFile), nil, nil, SW_SHOWNORMAL);
  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil); //刷新图标显示
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  S: string;
begin
  S := ParamStr(1);
  if FileExists(S) then Memo1.Lines.LoadFromFile(S);
end;

//执行注册函数; 执行后, 可随便修改一个文本文件的后缀为 tst, 然后双击测试
procedure TForm1.Button1Click(Sender: TObject);
begin
  RegApp('.tst', 'MyApp1', Application.ExeName); //假定程序名称是 MyApp1, 要打开的文件的后缀是 .tst
end;

end.

posted on   万一  阅读(2498)  评论(2编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2008-07-10 再学 GDI+[102]: TGPImage(22) - 获取所有解码器的详细信息
2008-07-10 再学 GDI+[101]: TGPImage(21) - 获取所有编码器的详细信息
2008-07-10 回复 "Timer008" 的一个类型转换的问题 - 不是很典型, 对其他人参考价值不大
2008-07-10 获取多边形面积的函数 - 回复 "dacsd" 的问题


点击右上角即可分享
微信分享提示