ファイルの関連付け
3278 ワード
注意:このコードはUACを迂回することはできません.テストしてもヒントがあります.
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:=StringReplace(aAppPath,'\', '\\',[rfReplaceAll]);
str4:=StringReplace( Format('"%s" "%%1"', [str3]) ,'"', '\"',[rfReplaceAll] );
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;
// ; , tst,
procedure TForm1.Button1Click(Sender: TObject);
begin
RegApp('.tst', 'MyApp1', Application.ExeName); // MyApp1, .tst
end;
procedure TForm1.FormCreate(Sender: TObject);
var
S: string;
begin
S := ParamStr(1);
if FileExists(S) then Memo1.Lines.LoadFromFile(S);
end;