Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.19;
Скачать: CL | DM;

Вниз

CreateProcess на WinTS 2003 не могу запустить cmd-файл   Найти похожие ветки 

 
Gavrila ©   (2007-02-28 10:54) [0]

Мастера, помогите, плз, написанная функция работает на XP Prof, на 2003 TS не работает. GetLastError возвращает код ошибки "3", что за ошибка такая, не могу понять и описаний не нашел

Function TMainForm.ExecFile(PathFile: String): Boolean;
var
Res    : LongBool;
PIn    : PROCESS_INFORMATION;
SII    : STARTUPINFO;
RetCode   : cardinal;
TmOut   : cardinal; //In seconds
i    : cardinal;
CreationsFlags : cardinal;
Params   : string;
Dsk    : boolean;
WinDir   : PChar;
   FileName  : PChar;
begin
Result:= False;
GetMem(WinDir, 144);
GetWindowsDirectory(WinDir, 144);

Dsk  := True;
TmOut := 10000;
FileName:= PChar(WinDir + "\system32\cmd.exe");
Params := "/C"" + PathFile + """;

Try
 if Dsk then
 begin
  CreationsFlags:= CREATE_DEFAULT_ERROR_MODE or
       NORMAL_PRIORITY_CLASS or
       CREATE_UNICODE_ENVIRONMENT;
 end
 else
 begin
  CreationsFlags:= CREATE_DEFAULT_ERROR_MODE or
       CREATE_NO_WINDOW or
       NORMAL_PRIORITY_CLASS or
       CREATE_UNICODE_ENVIRONMENT;
 end;

 getstartupinfo(SII);

 Res:= createprocess(
 FileName,       // lpApplicationName,  // pointer to name of executable module
 pchar(Params),      // lpCommandLine,   // pointer to command line string
 nil,        // lpProcessAttributes, // pointer to process security attributes
 nil,        // lpThreadAttributes,  // pointer to thread security attributes
 False,        // bInheritHandles,  // handle inheritance flag
 CreationsFlags,      // dwCreationFlags,  // creation flags
 nil,        // lpEnvironment,   // pointer to new environment block
 pchar(extractfilepath(FileName)), // lpCurrentDirectory,  // pointer to current directory name
 SII,        // pStartupInfo,   // pointer to STARTUPINFO
 PIn);        // lpProcessInformation // pointer to PROCESS_INFORMATION
except
 CloseHandle(Pin.hProcess);
 exit;
end;

if not Res then
begin
 ShowMessage(IntToStr(GetLastError));
 CloseHandle(Pin.hProcess);
 exit;
end;

i:= 0;
RetCode:=STILL_ACTIVE;
while (i <= TmOut) and (RetCode = STILL_ACTIVE) do
begin
 try
  GetExitCodeProcess(Pin.hProcess, RetCode);
 except
  CloseHandle(Pin.hProcess);
  exit;
 end;
 Sleep(1000);
 inc(i);
end;

if (i > TmOut) and (RetCode = STILL_ACTIVE) then
begin
 TerminateProcess(Pin.hProcess, RetCode);
 CloseHandle(Pin.hProcess);
 exit;
end;
CloseHandle(Pin.hProcess);

FreeMem(WinDir, 144);
Result:= True;
end;


 
Rouse_ ©   (2007-02-28 10:59) [1]


> Мастера, помогите, плз, написанная функция работает на XP
> Prof, на 2003 TS не работает. GetLastError возвращает код
> ошибки "3", что за ошибка такая, не могу понять и описаний
> не нашел

Значит очень плохо искал.
 { The system cannot find the path specified. }
 ERROR_PATH_NOT_FOUND = 3;
 {$EXTERNALSYM ERROR_PATH_NOT_FOUND}


 
Gavrila ©   (2007-02-28 11:11) [2]

Rouse_  спасибо, опыта в поиске маловато наверное, раз не нашел :(

понял в чем беда:
GetMem(WinDir, 144);
GetWindowsDirectory(WinDir, 144);


так вот в терминале
WinDir = "C:\Documents and Settings\Alex_P\Windows"
странно... буду дальше копать


 
Чапаев ©   (2007-02-28 11:22) [3]

Terminal Services:   If the application is running in a Terminal Services environment, each user has a private Windows directory. There is also a shared Windows directory for the system. If the application is Terminal-Services-aware (has the IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE flag set in the image header), this function returns the path of the system Windows directory, just as the GetSystemWindowsDirectory function does. Otherwise, it retrieves the path of the private Windows directory for the user.


 
Gavrila ©   (2007-02-28 11:25) [4]

всем спасибо, пошел работать


 
sniknik ©   (2007-02-28 12:02) [5]

> GetLastError возвращает код ошибки "3", что за ошибка такая, не могу понять и описаний не нашел
вообще искать и не надо
ShowMessage(SysErrorMessage(3));

еще лучше винапишние функции "оборачивать" в Win32Check (естественно если нужно по ситуации)

например твое
 try
   GetExitCodeProcess(Pin.hProcess, RetCode);
 except
   CloseHandle(Pin.hProcess);
   exit;
 end;

надо писать
 try
   Win32Check(GetExitCodeProcess(Pin.hProcess, RetCode));
 except
   CloseHandle(Pin.hProcess);
   exit;
 end;

иначе ексепта не будет даже если функция "пошла в отказ". а если будет ексепт то будет и понятная ошибка...


 
Gavrila ©   (2007-02-28 12:07) [6]

sniknik спасибо, учту



Страницы: 1 вся ветка

Текущий архив: 2007.08.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
2-1184858946
Kyro
2007-07-19 19:29
2007.08.19
Можно ли замкнуть дбгрид


2-1184911598
Newser
2007-07-20 10:06
2007.08.19
Как в DateTimePicker-е установить вчерашнее число?


2-1185443040
ММК
2007-07-26 13:44
2007.08.19
Поворот TImage


5-1160122325
BadTester
2006-10-06 12:12
2007.08.19
Имеется задача pеализовать выдвижную панель на экpане


3-1178288128
Inna_Z
2007-05-04 18:15
2007.08.19
Как узнать версию к которой подключились?