Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 3.961 c
2-1185178959
ambhtr
2007-07-23 12:22
2007.08.19
Как из интернета скопировать таблицу


2-1184781110
Sdubaruhnul
2007-07-18 21:51
2007.08.19
Поиск файлов возвращает артефакты


15-1184710325
Германн
2007-07-18 02:12
2007.08.19
Компилятор Дельфи


15-1184750417
БарЛог
2007-07-18 13:20
2007.08.19
Сумма нескольких полей MySQL


15-1185176069
Реактор
2007-07-23 11:34
2007.08.19
сеть, вай фай и аксесс





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский