понедельник, 8 марта 2010 г.

Неожиданное поведение Delphi 2010

Windows 7, 64-бита, Delphi 2010, последний день триального периода. В связи с вопросом http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=75999 набираю пример тестового кода

procedure TForm1.Button1Click(Sender: TObject);

begin
  RunApplication;
end;

procedure TForm1.RunApplication;

var
  sexinfo: SHELLEXECUTEINFO;
  AContext: TEWContextRecord;
  S: string;
begin
  FillChar(sexinfo, 0, SizeOf(sexinfo));
  sexinfo.cbSize := SizeOf(sexinfo);
  sexinfo.fMask := SEE_MASK_NOCLOSEPROCESS;
  sexinfo.lpFile := 'C:\Foo\bar.exe';
  Win32Check(ShellExecuteEx(@sexinfo));
  AContext.AppProcess := GetProcessId(sexinfo.hProcess);
  AContext.AppWnd := 0;
  EnumWindows(@MyEnumWindowsProc, Integer(@AContext));
  if IsWindow(AContext.AppWnd) then
  begin
    .....
    //Что-то
  end;
end;

Запускаю и удивляюсь - такое ощущение, что приложение запускается и тут же завершается. Если закомментировать строку AContext.AppProcess := GetProcessId(sexinfo.hProcess);  запускается, как положено, появляется форма с кнопкой, а стоит строку раскомментировать. Во всех окнах среды нет никаких замечаний, компиляция проходит без ошибок, предупреждений и хинтов. При запуске скомпилированного приложения вне среды, наконец появляется причина такого странного поведения:
Точка входа в процедуру GetProcessID не найдена в библиотеке DLL kernel32.dll.

Так как триал заканчивается завтра, скорее всего, не буду пытаться побороть.

Upd 09.03.2010: Delphi 2006 честно предупреждает об отсутствующей точке входа при попытке выполнить приложения в среде.

3 комментария:

  1. Известная проблема: QC report #63109. В каждой версии что-то докручивают, поведение меняется, но всё равно бывают ситуации, когда программа пускается на выполнение без разрешённых зависимостей импорта.

    В совокупности с другими проблемами, типа такой, при странных глюках надо не забывать делать прогон вне среды.

    ОтветитьУдалить
  2. Наблюдаемое мной поведение все-таки немного отличается от описанного в report#63109, в репорте AV, а тут тихое завершение, без какого-либо сообщения

    ОтветитьУдалить
  3. А просто оно каждый раз по-разному себя проявляет: когда AV, когда вообще ничего не происходит, а когда ещё что-то (я уверен, что видел ещё одну разновидность, но не вспомню сейчас точно), но, видимо, это один и тот же баг. В одну сторону потянут - с другой что-то вылезет.

    Поведение зависит от точной сборки и может меняться с выходом сервис пака. И это не только D2010, а появилось ранее. Хотя отчёт и отмечен как resolved в D2010, но статус стоит "Retest". Видимо, есть таки у них проблемы с его исправлением.

    ОтветитьУдалить