在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
答案 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种情况下,按原样使用。