Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > CreateProsess


Автор: tigger 17.10.2006, 18:15
Создаю процесс с помощью CreateProsess....
в диспетчере задач вижу его а на экране формы нет как ее показать на экран?

Автор: Yanis 17.10.2006, 18:24
tigger
Ты нам лучше код покажи smile

Автор: tigger 17.10.2006, 18:39
Код

procedure TForm1.Button1Click(Sender: TObject);
var
sti: tstartupinfo;
  lpPi: tprocessinformation;
  DE: _Debug_event;
  Cont: _Context;
  WindowName : integer;
  ProcessId : integer;
  ThreadId : integer;
  buf_new, buf_old : PChar;
  HandleWindow : Integer;
  Address: cardinal;
  _write, _read : cardinal;
  a : bool;
begin
  StI.cb := SizeOf(TStartUpInfo);
  StI.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StI.wShowWindow := SW_SHOWNORMAL;

a := CreateProcess(nil, PChar('E:\Program Files\ttt\ttt.exe'), nil, nil, true, DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS, nil, nil, StI, lpPI);
end;

Автор: Yanis 17.10.2006, 18:47
Цитата
STARTF_USESHOWWINDOW    If this value is not specified, the wShowWindow member is ignored.

Автор: tigger 18.10.2006, 06:05
Yanis, и что это значит по русски можешь сказать.

Автор: Yanis 18.10.2006, 07:26
tigger
Я не разобрался почему окно программы не отображатеся. Возможно поток спит сразу после запуска...

Цитата(tigger @  18.10.2006,  07:05 Найти цитируемый пост)
Yanis, и что это значит по русски можешь сказать. 

Это значит, что если ты указываешь STARTF_USESHOWWINDOW, то параметр wShowWindow не обязательно указывать -- он игнорируется.

И ещё. Не забывай вначале обнулять структуры:
Код
ZeroMemory(@sti, SizeOf(sti));

Автор: tigger 18.10.2006, 13:59
Цитата

tigger
Я не разобрался почему окно программы не отображатеся. Возможно поток спит сразу после запуска...

Как его разбудить ???

И вообще в чем собственно дело кто-нибудь знает???????????????????????????????7

Автор: bems 18.10.2006, 14:13
Цитата(Yanis @  18.10.2006,  07:26 Найти цитируемый пост)
Это значит, что если ты указываешь STARTF_USESHOWWINDOW, то параметр wShowWindow не обязательно указывать -- он игнорируется.
читаешь через слово.

Цитата(Yanis @  17.10.2006,  18:47 Найти цитируемый пост)
If this value is not specified, the wShowWindow member is ignored


Автор: Akella 18.10.2006, 16:10
запускаем процесс и ждём пока он завершиться
Код

function TfmMain.ExecAndWait(const FileName, Params: ShortString; ArcDir:string;
                               const WinState: Word): boolean; export;
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: ShortString;
begin
  { Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x }
  CmdLine := '"' + Filename + '" ' + Params;
  FillChar(StartInfo, SizeOf(StartInfo), #0);
  with StartInfo do
  begin
    cb := SizeOf(StartInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
    wShowWindow := WinState;
  end;
  Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false,
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
                          PChar(ArcDir),StartInfo,ProcInfo);
  { Ожидаем завершения приложения }
  if Result then
  begin
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    { Free the Handles }
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;
end;


Пример использования
Код

          fmMain.ExecAndWait(
                             fmMain.sWinrar, // <- "C:\Program Files\Winrar\Winrar.exe"
                             'a -df -ep '+fmMain.sFilialName+'_'+FormatDateTime('YYYYMMDD_HHNNSS_zzz',now)+' @'+fmMain.GetSystemPath(WinTemp)+'ToSend.List', //<- параметры
                             fmMain.sOutFolder, //<- типа рабочая папка
                             sw_ShowNormal //<- показываем нормально, свёрнуто, развёрнуто или вообще не показываем
                            );




Автор: Yanis 18.10.2006, 23:15
Цитата(Akella @  18.10.2006,  17:10 Найти цитируемый пост)
запускаем процесс и ждём пока он завершиться

Всё верно, но код не в тему smile

bems
Спасибо. Что то я в последнее время растерянный....

tigger
Ты сам знаешь что хочешь сделать? Что требуется?

Добавлено @ 23:15 
Цитата(Akella @  18.10.2006,  17:10 Найти цитируемый пост)
запускаем процесс и ждём пока он завершиться

Всё верно, но код не в тему smile

bems
Спасибо. Что то я в последнее время растерянный....

tigger
Ты сам знаешь что хочешь сделать? Что требуется?

Автор: tigger 19.10.2006, 10:43
Мне нужен CreateProcess с флагами DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS
для отладки (установок бряков и чтения значений регистров).

Автор: bems 20.10.2006, 00:24
у меня вообще не запускается процесс, и код ошибки странный какой-то...

Автор: tigger 20.10.2006, 06:20
Пробовал получать id процесса а потом
DebugActiveProcess(id) так эта процедура его виснет????

Автор: BUGOR 20.10.2006, 11:33
Да он и не должен стартовать... Он ждёт пока ты обработаешь первое событие-исключение(при запуске первой инструкции отлаживаемого процесса):

Код

flag :=0;
    GetStartupInfo(si);
    if CreateProcess(pChar(FileName),nil,nil,nil,FALSE,DEBUG_PROCESS+DEBUG_ONLY_THIS_PROCESS,nil,nil,si,pi) then
    begin
        while TRUE do begin
            WaitForDebugEvent(DBEvent,INFINITE);
            if DBEvent.dwDebugEventCode = EXIT_PROCESS_DEBUG_EVENT then begin
                exit;
            end;
            if dbevent.dwDebugEventCode = CREATE_PROCESS_DEBUG_EVENT then begin
                ShowMessage('Process is created');
            end;
            if dbevent.dwDebugEventCode = EXCEPTION_DEBUG_EVENT then begin
                if flag = 0 then  begin
                  ContinueDebugEvent(DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_CONTINUE);
                  inc(flag);
                end;
            end;
            ContinueDebugEvent(DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);
        end;
    end;



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)