2

다음 코드는 CreateProcess을 사용하여 환경 변수로 명령을 실행합니다. 여기에서 notepad %APPDATA%\test.txt을 실행하려고 시도합니다.CreateProcess로 인스턴스화 된 명령에서 환경 변수를 사용하거나 확장하는 방법은 무엇입니까?

notepad %APPDATA%\test.txtWindows' CMD에서 직접 실행하면 % APPDATA %이 (가) 확장됩니다. 그러나 CreateProcess을 실행하면 환경 변수를 확장 할 수 없습니다. 이유 및 해결 방법에 대한 의견을 제시 하시겠습니까? 모든 의견을 주시면 감사하겠습니다!

directly within cmd use CreateProcess

program TestConsole2; 

    {$APPTYPE CONSOLE} 

    uses 
     Windows, SysUtils; 

    var 
     I: Integer; 
     ProgramName: String; 
     StartInfo : TStartupInfo; 
     ProcInfo : TProcessInformation; 
     CreateOK : Boolean; 
    begin 
     try 

     FillChar(StartInfo, SizeOf(StartInfo), #0); 
     FillChar(ProcInfo, SizeOf(ProcInfo), #0); 
     StartInfo.cb := SizeOf(StartInfo); 

     ProgramName := 'NOTEPAD %APPDATA%\test.txt'; 
     CreateOK := CreateProcess(
      nil, PChar(ProgramName), nil, nil, True, 0, nil, nil, StartInfo, ProcInfo); 
     if CreateOK then WaitForSingleObject(ProcInfo.hProcess, INFINITE); 

     Readln(ProgramName); 

     except 
     on E: Exception do 
      Writeln(E.ClassName, ': ', E.Message); 
     end; 
    end. 

답변

10

전화 ExpandEnvironmentStrings는 환경 변수를 확장합니다.

cmd.exe를 사용하면 확장이 수행됩니다. CreateProcess는 CreateProcess를 호출하기 전에 수행 할 필요가 없습니다. 또는 ShellExecute를 사용하여 환경 문자열을 확장 할 수 있습니다.

현재 코드가 CreateProcess 계약을 충족하지 않습니다. 두 번째 매개 변수는 수정 가능한 메모리에 대한 포인터 여야합니다. ANSI API를 사용하고 있지만 Unicode를 목표로 삼을 경우 코드가 실패 할 가능성이 있습니다. 포인터를 리터럴에 대한 포인터가 아닌 수정 가능한 메모리에 전달하십시오. 환경 변수를 확장하기 위해 호출을 추가하면 수정 가능한 문자열로 끝납니다.

마지막으로 텍스트 파일을 열려고하는 것 같습니다. 왜 사용자가 메모장에서 그것을 보도록 강요합니까? 내 기본 텍스트 파일 편집기는 Notepad가 아닙니다. 나는 메모장을 내게 강요한 프로그램을 싫어한다. 대신 쉘이 사용자가 선호하는 편집기에서 파일을 열도록하십시오. ShellExecute를 호출하고 'open'을 동사로 사용하고 텍스트 파일 이름을 파일 이름 매개 변수로 전달하십시오. 다른 한편으로, 아마도 여러분은이 모든 것을 알고 있으며 이것은 단지 예제 코드 일뿐입니다. 그렇다면이 조언을 무시하십시오.

+0

많은 의견을 보내 주셔서 감사합니다. :) – SOUser

관련 문제