ファイルの関連付け

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;