2015-08-13 4 views

ответ

6

Вы не можете передавать переменные среды в WinExec(). Вы должны решить их первый:

uses 
    ..., SysUtils; 

function GetPathToTestExe: string; 
begin 
    Result := SysUtils.GetEnvironmentVariable('APPDATA'); 
    if Result <> '' then 
    Result := IncludeTrailingPathDelimiter(Result) + 'TEST.exe'; 
end; 

uses 
    ..., Windows; 

var 
    Path: string; 
begin 
    Path = GetPathToTestExe; 
    if Path <> '' then 
    WinExec(PAnsiChar(Path), SW_SHOW); 
end; 

В качестве альтернативы:

uses 
    ..., SysUtils, Windows; 

function GetPathToTestExe: string; 
var 
    Path: array[0..MAX_PATH+1] of Char; 
begin 
    if ExpandEnvironmentStrings('%APPDATA%', Path, Length(Path)) > 1 then 
    Result := IncludeTrailingPathDelimiter(Path) + 'TEST.exe' 
    else 
    Result := ''; 
end; 

более надежный (и официальный) способ получить путь к папке APPDATA является использование SHGetFolderPath() (или на Vista +):

uses 
    ..., SysUtils, Windows, SHFolder; 

function GetPathToTestExe: string; 
var 
    Path: array[0..MAX_PATH] of Char; 
begin 
    if SHGetFolderPath(0, CSIDL_APPDATA, 0, SHGFP_TYPE_CURRENT, Path) = S_OK then 
    Result := IncludeTrailingPathDelimiter(Path) + 'TEST.exe' 
    else 
    Result := ''; 
end; 

Но, в любом случае, WinExec() устарела начиная с Windows 95, вы действительно должны использовать вместо CreateProcess():

uses 
    ..., Windows; 

var 
    Path: String; 
    si: TStartupInfo; 
    pi: TProcessInformation; 

Path := GetPathToTetExe; 
if Path <> '' then 
begin 
    ZeroMemory(@si, SizeOf(si)); 
    si.cb := SizeOf(si); 
    si.dwFlags := STARTF_USESHOWWINDOW; 
    si.wShowWindow := SW_SHOW; 

    if CreateProcess(nil, PChar(Path), nil, nil, FALSE, 0, nil, nil, @si, pi) 
    begin 
    //... 
    CloseHandle(pi.hThread); 
    CloseHandle(pi.hProcess); 
    end; 
end; 
Смежные вопросы