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 честно предупреждает об отсутствующей точке входа при попытке выполнить приложения в среде.
понедельник, 8 марта 2010 г.
Подписаться на:
Комментарии к сообщению (Atom)
Известная проблема: QC report #63109. В каждой версии что-то докручивают, поведение меняется, но всё равно бывают ситуации, когда программа пускается на выполнение без разрешённых зависимостей импорта.
ОтветитьУдалитьВ совокупности с другими проблемами, типа такой, при странных глюках надо не забывать делать прогон вне среды.
Наблюдаемое мной поведение все-таки немного отличается от описанного в report#63109, в репорте AV, а тут тихое завершение, без какого-либо сообщения
ОтветитьУдалитьА просто оно каждый раз по-разному себя проявляет: когда AV, когда вообще ничего не происходит, а когда ещё что-то (я уверен, что видел ещё одну разновидность, но не вспомню сейчас точно), но, видимо, это один и тот же баг. В одну сторону потянут - с другой что-то вылезет.
ОтветитьУдалитьПоведение зависит от точной сборки и может меняться с выходом сервис пака. И это не только D2010, а появилось ранее. Хотя отчёт и отмечен как resolved в D2010, но статус стоит "Retest". Видимо, есть таки у них проблемы с его исправлением.