文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:34
字数 337
阅读 8
收藏 0
点赞 0
评论 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
博文 2004
码字总数 14107
作品 0
深圳
程序员
怎么让改class文件之后不让resin自动重启?

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

卐卍卍卐 ⋅ 2013/10/21 ⋅ 3

Python基础之格式化输出函数format()详解

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

python教程 ⋅ 06/02 ⋅ 0

delphi服务程序(service)的调试方法

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

vga ⋅ 2014/08/01 ⋅ 0

关于Control.getModel()方法中 TypeConverter.convert()方法的问题。

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

27号 ⋅ 2012/11/15 ⋅ 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 ⋅ 2

@红薯 不能改下弹出评论框为可拖动吗?

@红薯 你好,想跟你请教个问题: @红薯 不能改下弹出评论框为可拖动吗? 评论的时候太不方便了我要看别人的回复啊...全挡住了...

loyal ⋅ 2012/06/29 ⋅ 8

mysql 1亿数据以上处理

现在数据量太大 估计达到2亿数据 但是我该怎么处理最好!!用etl? 因为这些数据我得汇总 操作起来太不方便了!!!大家有木有良策!!!求讨教!!!

stevenliu ⋅ 2012/08/17 ⋅ 7

jfinal路由配置能否智能扫包?

@JFinal 你好,想跟你请教个问题:配置文件里面的configRoute public void configRoute(Routes me) { // TODO Auto-generated method stub me.add("/hello",HelloController.class); } 如果每......

bing_chuan ⋅ 2013/04/05 ⋅ 6

求推荐: 好用,开源的C/C++ IDE

如题. P.S. 网上很多人都说CodeLite好用, 于是我试用了下, 但是用的时候, 感觉调试Watch太不方便了, 因此发帖求推荐.

有初啊 ⋅ 2013/01/11 ⋅ 22

Linux C语言 如何判断该进程是否还存在

虽然shell很方便,但是我用QT的话,接shell就不方便了,这是网上拷贝的,与君分享: int detectprocess(char * processname){ } 原文链接:http://blog.csdn.net/lanmanck/article/details/6...

长平狐 ⋅ 2012/06/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何使用serverchan微信推送告警

之前实现推送告警信息到微信的方法有如下几种: 1、通过企业公众号实现----收费: 2、通过QQ邮箱,在微信平台上开启收到邮件进行提醒; 3、第三方告警平台API,一般也是收费的; 不过最近看文...

问题终结者 ⋅ 26分钟前 ⋅ 0

TCP的RPC

RPC就是远程方法调用(Remote Process Call ),包含了客户端和服务端,涉及了对象的序列化传输。 1.服务端启动,注册远程调用的类2.客户端发送请求信息包含类、方法、参数的一些信息、序列化传...

Cobbage ⋅ 47分钟前 ⋅ 0

IOS-UI UI初步代码布局添加事件

ISO开发界面,UI是必须学习的一部分,其实很早之前想学来了,一直没有沉下心来学习。看到IOS的代码风格和布局就别扭的不行,跟java代码和android布局比较显得不是那么方便,所以一直到现在。...

京一 ⋅ 57分钟前 ⋅ 0

浅谈OpenDaylight的二次开发

OpenDaylight作为一款开源SDN网络控制器,依托于强大的社区支持以及功能特性,成为了目前主流的SDN网络控制器开发平台。在比较稳定的OpenDaylight Helium版本中,已经为开发者提供了大量的网...

wangxuwei ⋅ 今天 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在config/jwt.php默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更...

等月人 ⋅ 今天 ⋅ 0

Java NIO之文件处理

程序要操作本地操作系统的一个文件,可以分为以下三个部分: 对文件位置的操作 对文件的操作 对文件内容的操作 其中,对文件内容的操作在 Java NIO之Channel 中已经有了介绍,通过FileChann...

士别三日 ⋅ 今天 ⋅ 0

Maven的pom.xml配置文件详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.......

小海bug ⋅ 今天 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 今天 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部