Delphi:从uninstallstring注册表项中提取路径文件

时间:2017-05-20 14:09:58

标签: delphi

在Delphi Seattle中如何检测文件是否存在,如果在SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall on UninstallString上是参数,例如:

Path

我只需要提取路径:

1) "C:\Users\Radek\AppData\Local\Microsoft\OneDrive\OneDrive.exe" /background
2) C:\Users\Radek\AppData\Local\Microsoft\OneDrive\OneDrive.exe /background
3) C:\PROGRA~2\Raize\CS5\UNWISE.EXE C:\PROGRA~2\Raize\CS5\CS5_EX~1.LOG
4) C:\Program Files (x86)\CollabNet\uninst.exe

2 个答案:

答案 0 :(得分:1)

您可以使用CommandLineToArgvW API函数。根据有关argument conventions的链接文档,第一个解析的参数应该是文件名:

  

按照惯例,argv[0]是程序所使用的命令   调用argv[1]是第一个命令行参数,依此类推,直到   argv[argc],始终为NULL。

所以尝试这样的事情(没有经过测试,基于this example):

uses
  ShellAPI;

function TryGetCommandLineFileName(const CommandLine: string; out FileName: string): Boolean;
type
  TPWideCharArray = array[0..0] of PWideChar;
var
  Count: Integer;
  Arguments: PPWideChar;
begin
  Arguments := CommandLineToArgvW(PChar(CommandLine), Count);
  Result := Assigned(Arguments) and (Count > 0);
  if Result then
  begin
    FileName := TPWideCharArray(Arguments^)[0]); // argv[0] should be the file name
    LocalFree(THandle(Arguments));
  end;
end;

PathRemoveArgs API函数,仅用于此目的。但要注意后者在参考文献中有这个注释:

  

不应在通用命令路径模板上使用函数   (来自用户或注册表),但它应该仅用于   应用程序知道格式良好的模板。

所以在这种情况下,我更喜欢第一个,但两个都应该工作(我假设,不能测试)这么长的字符串没有格式错误。

答案 1 :(得分:0)

在第一种情况下,请使用AnsiExtractQuotedStr()AnsiDequotedStr()

在第二和第三种情况下,使用Pos()查找第一个空格,然后使用Copy()SetLength()将字符串修剪为指定的长度。

在第4种情况下,按原样使用。