文档章节

XP 之后, Delphi 动注册表不方便了...逼出来一个办法:

涂孟超
 涂孟超
发布于 2014/09/26 15:34
字数 337
阅读 10
收藏 0

手头的程序需要修改注册表, 以让当前程序成为某格式的默认打开程序并关联图标; 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.

本文转载自:http://www.cnblogs.com/del/p/3182126.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
怎么让改class文件之后不让resin自动重启?

怎么让改class文件之后不让resin自动重启啊? 我每次改个class文件就自动重启了,太不方便了

卐卍卍卐
2013/10/21
962
3
delphi服务程序(service)的调试方法

delphi服务程序(service)的调试方法 delphi service 调试 方法一: 1.调试delphi 写的服务程序,有这么一个办法。原来每次都是用attach to process方法,很麻烦。并且按照服务线程的执行线路...

vga
2014/08/01
0
0
Python基础之格式化输出函数format()详解

之前发过一篇文章:Python基础之常用格式化输出字符详解,但是呢,有时候我们需要用到多个%的时候,用这个就很不方便了,比如数错%数量或者一 一对应的时候。。。 这里补充一个字典方式的格式化...

python教程
06/02
0
0
关于Control.getModel()方法中 TypeConverter.convert()方法的问题。

@JFinal 你好,想跟你请教个问题: 关于这个地方,我post传过来的参数需要的就是空字符串,不是null,这个地方如何处理? public static final Object convert(Class clazz, String s) thro...

27号
2012/11/15
355
1
刚发现jsoup的eq跟jquery的规则不一样,尽快支持索引吧

rt. jsoup api elements whose sibling index is equal to n finds the first cell of each row jsoup里的eq是 form input:eq(1) 表示只包含一个 input 的表单,而不是取表单中第一个input的......

lrwin
2012/01/17
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

DES/3DES(TripleDES)加密、解密测试数据

以下结果经 PHP+openssl及VB.NET验证,ECB模式。 PHP 7.0.10 (cli) (built: Aug 18 2016 09:48:53) ( ZTS ) OpenSSL Library Version: OpenSSL 1.0.1t 3 May 2016 VB.net 2003 ****** DES(S......

SamXIAO
31分钟前
1
2
Java11的新特性

Java语言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 序 本文主要讲述一下Java11的新特性 版本号 java...

go4it
32分钟前
3
0
Maven常用命令及相关笔记

Maven常用命令 dos指令 4. 编译源代码: mvn compile 6. 运行测试: mvn test 8. 打包: mvn package 9. 在本地Repository中安装jar: mvn install 10. 清除产生的项目: mvn clean 4. 运行项...

颖伙虫
38分钟前
1
0
swagger2.2.2 与 spring cloud feign冲突 导致服务请求报空

swagger2.2.2 与 spring cloud feign冲突 Java代码 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.choosefine.web.console.ar......

泉天下
42分钟前
1
0
设计模式之 明确责任 观察者模式 状态模式 责任链模式

观察者模式是任务分发的一种模式。 如果认为我们设计的系统的各个模块(或子系统)的最终目的是完成共同任务,那么这个任务如何分配到多个模块的就是我们遇到的第一个问题。简单设计场合我们...

backbye
46分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部