Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Create Process ! [D6, WinXP]


psa247 ©   (2005-11-25 13:27:00) 

Создаю процесс таким образом. Иногда функция не запускает процесс, но и в качестве результата выдает пустую строку. Подскажите, где ошибка


function TF.Exec_Process(exename, param : string; par : boolean): string;
var Startup : TStartupInfo;
  Process : TProcessInformation;
begin
  EUID:= '{C6B82C32-30DA-4851-A8CC-EA67CD058787}';
  SetLastError(0);

  Startup.lpReserved:= PChar(0);
  Startup.lpDesktop:= PChar(0);
  Startup.lpTitle:= PChar(0);
  Startup.dwFlags:= STARTF_USESHOWWINDOW;
  Startup.wShowWindow:= SW_NORMAL;
  Startup.cbReserved2:= 0;
  Startup.lpReserved2:= PByte(0);
  FillMemory(@Startup,sizeof(Startup),0);
  Startup.cb:=Sizeof(Startup);

  // Если процесс не был создан, то возвращается код ошибки
  if CreateProcess(PChar(exename),          // lpApplicationName
                   PChar(param),            // lpCommandLine
                   PSecurityAttributes(0),  // lpProcessAttributes
                   PSecurityAttributes(0),  // lpThreadAttributes
                   par,                     // bInheritHandles
                   NORMAL_PRIORITY_CLASS,   // dwCreationFlags
                   nil,                     // lpEnvironment
                   PChar(Path),             // lpCurrentDirectory
                   Startup,                 // lpStartupInfo
                   Process)                 // lpProcessInformation)
                   then Result:= 'ok'
else begin
    Result:= SysErrorMessage(GetLastError);
    end;
end;


isasa   (2005-11-25 16:07:00) [1]

В param, если он не пустой - пробел в начало.

param:=' XXXXXXXXXXXXXXX';


psa247   (2005-11-25 15:35:00) [2]


> Fay ©

Возможно ли, вызвать системный диалог свойсв файла без использования ShellExecuteEx?


Fay   (2005-11-25 15:31:00) [3]

2 psa247 ©   (25.11.05 15:02) [16]
А ShellExecuteEx не подойдёт?


psa247   (2005-11-25 15:02:00) [4]

Скажите, как с помощью CREATEPROCESS открывать указанные файлы с помощью программ по умолчанию ? Выяснять расширение и программу, связанную с ним, и потом уже запускать через  CREATEPROCESS ?


psa247   (2005-11-25 14:50:00) [5]

Спасибо. Я попытаюсь разобраться.


Digitman   (2005-11-25 14:46:00) [6]


> В каких случаях lpEnvironment обязательно использовать?


в дан.случае это не принципиально - то что ты пытаешься запустить на самом деле не является полноценным исп.файлом приложения


Digitman   (2005-11-25 14:44:00) [7]

ERROR_BAD_EXE_FORMAT = 193;

SysErrorMessage(193) должна была вернуть строку

"такой-то-файл is not a valid Windows NT application"


Fay   (2005-11-25 14:42:00) [8]

ERROR_BAD_EXE_FORMAT ?!


Fay   (2005-11-25 14:41:00) [9]

2 psa247 ©   (25.11.05 14:33) [9]
Ну написал бы тогда, что пишет RaiseLastOSError...


psa247   (2005-11-25 14:35:00) [10]

В каких случаях lpEnvironment обязательно использовать?


psa247   (2005-11-25 14:33:00) [11]


> КАКОЙ код тебе возвратила GetLastError()

193


Digitman   (2005-11-25 14:33:00) [12]

lpEnvironment - указатель на область памяти, содержащей блок переменных окружения будущего процесса


> Почему GetLastError - вычитал в справке, оно привычней


??

я спросил - ЧТО у тебя возвратила эта ф-ция ?


psa247   (2005-11-25 14:30:00) [13]

Path - рабочая папка для нового процесса.
Почему GetLastError - вычитал в справке, оно привычней.

Разъясните что lpEnvironment означает ?


Digitman   (2005-11-25 14:23:00) [14]


> psa247 ©   (25.11.05 14:18) [5]


> Седло убрал...
>
> То же самое.


это было частное замечание, на сабж не влияющее ... равно как и FillMemory() не в том месте... в ЛЮБОМ случае, если CreateProcess() по каким-то причинам отказала, то конкретные причины отказа лежат в коде, возвращенном ф-цией GetLastError() ... отсюда и вопрос - КАКОЙ код тебе возвратила GetLastError() ?


psa247   (2005-11-25 14:18:00) [15]


> BiN ©,  Чапаев ©

Сделал.

> Digitman ©   (25.11.05 13:57) [4]

Седло убрал...

То же самое.


Digitman   (2005-11-25 13:57:00) [16]

да к тому же и SetLastError(0) здесь как корове седло ..


BiN   (2005-11-25 13:51:00) [17]

вдогонку к
> Digitman ©   (25.11.05 13:41) [1]


FillMemory(@Startup,sizeof(Startup),0); стоит в неположенном месте
да и описатели полученные неплохо бы закрыть.


Чапаев   (2005-11-25 13:50:00) [18]

Шутник, аднака! Сначала поля Стартапа заполняет, а потом его FillChar нулями... Что такое вообще Path?


Digitman   (2005-11-25 13:41:00) [19]

А зачем это вообще понадобилось - получать в кач-ве рез-та сообщение, которое, кстати, м.б. совершенно различным (при одной и той же ошибке) на разных ОС или на разных локализациях ?

Чем не устраивает Win32Check() и обработка исключения ?
Или, на кр.случай, возврат кода ошибки для последующего анализа ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо