Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2008, 14:37   #1
Хамяг
Форумчанин
 
Аватар для Хамяг
 
Регистрация: 22.08.2008
Сообщений: 105
По умолчанию WaitForSingleObject в Delphi 2009

Код:
CreateProcess(nil,'u.exe', nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo);
WaitForSingleObject(ProcessInfo.hProcess, infinite);
Компиляция проходит успешно, но при работе программы вылетает ошибка:



В delphi 7 всё было нормально. В delphi 2009 стала появляться эта ошибка. В чём же дело?
Хамяг вне форума Ответить с цитированием
Старый 09.01.2009, 05:52   #2
DelDev
Пользователь
 
Аватар для DelDev
 
Регистрация: 09.01.2009
Сообщений: 24
Сообщение

Здесь ошибка не в WaitForSingleObject, а в CreateProcess.

Дело в том, что при вызове CreateProcess в Delphi 7 фактически вызывался ANSI вариант этой функции - CreateProcessA, а в Delphi 2009 вызывается Юникод-вариант CreateProcessW, который ведет себя несколько иначе:

Цитата:
The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.
Источник - MSDN

Изходя из цитаты, вторым параметром не должна быть константа или строковое выражение, здесь должна быть переменная, содержащая соответствующее имя файла. Иначе может возникнуть ошибка нарушения доступа, что и произошло в вашем случае.
DelDev вне форума Ответить с цитированием
Старый 10.01.2009, 03:07   #3
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Может ZeroMemory(@StartupInfo, sizeof(StartupInfo)); нет?
пыщь

Последний раз редактировалось JTG; 10.01.2009 в 03:11.
JTG вне форума Ответить с цитированием
Старый 10.01.2009, 09:18   #4
DelDev
Пользователь
 
Аватар для DelDev
 
Регистрация: 09.01.2009
Сообщений: 24
По умолчанию

не понял вопроса ...
DelDev вне форума Ответить с цитированием
Старый 10.01.2009, 10:29   #5
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

попробуй перед CreateProcess сделать это
ZeroMemory(@StartupInfo, sizeof(StartupInfo))
rpy3uH вне форума Ответить с цитированием
Старый 10.01.2009, 10:47   #6
DelDev
Пользователь
 
Аватар для DelDev
 
Регистрация: 09.01.2009
Сообщений: 24
По умолчанию

Полностью работоспособная процедура в ранних версиях Delphi, но не работающая в Delphi 2009, по причине аналогичной проблеме у автора поста.

Код:
function RunDosAndWait(const CommandLine: string; OutSrings: TStrings): boolean;
const
  BuffSize = 1024;
var
  SecurityAttributes: TSecurityAttributes;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  tRead, cWrite, dwRead, dwAvail: Cardinal;
  Buffer: PChar;
  ExitCode: Cardinal;
begin
  Result := false;
  Application.ProcessMessages;
  Buffer := AllocMem(BuffSize);
  OutSrings.Clear;
  ZeroMemory(@SecurityAttributes, SizeOf(TSecurityAttributes));
  SecurityAttributes.nLength := SizeOf(TSecurityAttributes);
  SecurityAttributes.bInheritHandle := true;
  SecurityAttributes.lpSecurityDescriptor := nil;
  if not CreatePipe(tRead, cWrite, @SecurityAttributes, 0) then
    raise Exception.Create('Pipe not Created');
  ZeroMemory(@StartupInfo, SizeOf(TStartupInfo));
  with StartupInfo do
  begin
    cb := SizeOf(TStartupInfo);
    dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
    wShowWindow := SW_HIDE;
    hStdError := cWrite;
  end;
  if CreateProcess(nil, PChar(CommandLine), nil, nil, true, 0, nil, nil, StartupInfo, ProcessInfo) then
  begin
    repeat
      Application.ProcessMessages;
      PeekNamedPipe(tRead, Buffer, BuffSize, @dwRead, @dwAvail, nil);
      while (dwRead > 0) do
      begin
        ZeroMemory(Buffer, BuffSize);
        ReadFile(tRead, Buffer[0], BuffSize, dwRead, nil);
        if dwRead > 0 then
        begin
          OutSrings.Text := OutSrings.Text + Buffer;
          PeekNamedPipe(tRead, Buffer, BuffSize, @dwRead, @dwAvail, nil);
        end;
      end;
      GetExitCodeProcess(ProcessInfo.hProcess, ExitCode);
    until (ExitCode <> STILL_ACTIVE);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
  end
  else
    Raise Exception.Create('Ошибка создания процесса');
end;
при изменении описания на
Цитата:
function RunDosAndWait(VAR CommandLine: string; OutSrings: TStrings): boolean;
Проблема исчезает, истинную причину я описал выше
DelDev вне форума Ответить с цитированием
Старый 18.03.2009, 18:28   #7
hg_04
Новичок
Джуниор
 
Регистрация: 18.03.2009
Сообщений: 2
По умолчанию

столкнулся с этой же проблемой но изменение на вар не помогло, ошибка так и появляеться. выше приведенный код не работает
hg_04 вне форума Ответить с цитированием
Старый 18.03.2009, 18:39   #8
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

вывод: Delphi 2009 не рулит.
rpy3uH вне форума Ответить с цитированием
Старый 18.03.2009, 18:59   #9
hg_04
Новичок
Джуниор
 
Регистрация: 18.03.2009
Сообщений: 2
По умолчанию

рулит только сначала нужно понять как рулить
hg_04 вне форума Ответить с цитированием
Старый 23.05.2009, 14:38   #10
Showy
Форумчанин Подтвердите свой е-майл
 
Аватар для Showy
 
Регистрация: 08.08.2007
Сообщений: 183
По умолчанию

Рулит!
Просто надо правильно преобразовывать:
Код:
...
if CreateProcess(nil, PWCHAR(WideString(CommandLine)), nil, nil, true, 0, nil, nil, StartupInfo, ProcessInfo) then
...
и всё будет работать.
Until The End Of Time
Showy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Документация по Delphi 2009 JY_ Общие вопросы Delphi 2 17.08.2011 19:35
Delphi 2009 + MySQL MasterofCDM БД в Delphi 0 14.11.2008 16:55
Работа с ресурсами в Delphi 2009 Killbrum Помощь студентам 5 09.09.2008 09:52