Delphi TOpenDialog зависает в Windows 2008 при запуске в качестве приложения удаленного рабочего стола - PullRequest
12 голосов
/ 08 июля 2010

У меня есть Delphi 2010 exe, который запускает второй exe.Во втором exe есть диалог, который вызывает openDialog.execute.Когда это выполняется под Windows 2008 Enterprise R2 с удаленным рабочим столом, оно работает, как и ожидалось, , но при запуске в качестве удаленного приложения , как только всплывает диалоговое окно файла, приложение зависает, поворачивая все приложениеокна белые.Единственный способ выйти из него - закрыть приложение.Я попытался заменить TOpenDialog на TFileOpenDialog, результаты совпадают.Я рассмотрел изменение файла RDP, который запускает основное приложение, но не видит там никаких параметров, которые могли бы изменить ситуацию.Кто-нибудь когда-либо видел такое поведение раньше?


2010.07.13 Обновлено

Воспроизводится на простом примере.В примере есть два исполняемых файла.Первый - это средство запуска файлов, называемое m_module.exe, которое содержит одну кнопку редактирования, одну кнопку и приведенный ниже код.Я изменяю имя исполняемого файла в редакторе, чтобы он соответствовал второму исполняемому файлу, прежде чем я нажму кнопку запуска:

procedure TForm1.Button1Click(Sender: TObject);
begin
     ShellExecute(Handle, 'open', stringToOLEstr(edit1.text) , nil, nil, SW_SHOWNORMAL) ; 
end;

procedure TForm1.FormShow(Sender: TObject);
begin
     edit1.text:=application.exename;
end;

Второй исполняемый файл содержит кнопку и код ниже:

procedure TForm1.Button1Click(Sender: TObject);
begin
     OpenDialog1.execute;
end;

Первый модуль запускается из файла RDP.

2010.07.14 Обновлено

Я обнаружил, что если я копирую следующие библиотеки:

thumbcache.dll 
dtsh.dll 
wkscli.dll 

из папки \ Windows \ System32 в папку приложения, проблема устранена.

Я также обнаружил, что изменение уровней владения и разрешений для этих библиотек в папке \ Windows \ System32 с TrustedInstaller на группу администраторов приводит к тому же результату (копирование их в каталог приложения меняет владельца и права доступа.)подумайте)

Чтобы подтвердить это, я убедился, что ошибки появились снова, если я изменил уровни владения и разрешений обратно на TrustedInstaller вне группы администраторов.

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

2010.07.18 Обновлено

Некоторая дополнительная информация, которая может быть полезна (предоставлена ​​Embarcadero):

Эта статья MSDN для GetWindowsDirectory http://msdn.microsoft.com/en-us/library/ms724454%28VS.85%29.aspx описывает интересное поведение приложений, работающих в службах терминалов.Хотя GetWindowsDirectory не вызывается напрямую, песочница системного каталога Windows для пользователя может вызывать какие-то проблемы.Возможно, одна из библиотек DLL в вызывающей цепочке GetOpenFileNameA пытается сослаться на настоящую DLL в реальном системном каталоге, а не в изолированную, вызывая нарушение прав.Это просто предположение, но это стоит исследовать.Если вы смогли заставить SysInternals Process Monitor или Process Explorer работать на сервере, вы должны увидеть commdlg32 и другие DLL в загружаемой трассировке стека.

Все устаревшие приложения (т. Е. Все приложения, не созданные для служб терминалов или служб удаленных рабочих столов) работают на уровне совместимости приложений.См. Эту статью MSDN http://msdn.microsoft.com/en-us/library/cc834995%28VS.85%29.aspx.Флаг IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE определен в Windows.PAS.В целях тестирования вы можете добавить его в PE-заголовок вашего приложения, добавив Windows в раздел USES вашего приложения и прямо в разделе USES введите:

{$ SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}

Это приведет к тому, что ваше приложениеобойти уровень совместимости.В настоящее время я изучаю, сохраняют ли порожденные процессы (например, ваш второй exe) все права и настройки приложения, определенные в RDS.

Ответы [ 6 ]

2 голосов
/ 20 июля 2010

FWIW, у нас похожая ситуация, но она вызвана необходимостью безопасности, а не сбоем. Когда наше приложение запускается через Citrix, нам запрещено показывать обычные окна «открыть» или «сохранить как». Таким образом, мы катились самостоятельно. Он содержит комбинацию букв дисков (только для локальных дисков), селектора папок (только для утвержденных дисков), селектора имени файла и поля редактирования имени файла.

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

Если они не работают в песочнице, мы показываем обычные диалоги файлов Windows. Функция-обертка позволяет нам вызывать ее из любого места и оставить решение «песочница против окон» в одном месте.

2 голосов
/ 09 июля 2010

Windows сообщает AV (c0000005) в модуле thumbcache.dll.

Я думаю, что thumbcache.dll как-то связан с созданием / кэшированием миниатюр для файлов.Создание миниатюр может означать использование сторонних расширений для Explorer, что может плохо работать с RDP.

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

PS См. Также эту статью: Как отлаживать зависание приложения? Но я думаю, что зависание - это просто следствие другой проблемы в вашем случае.

0 голосов
/ 04 марта 2016

Если Z-порядок неверен (что я часто вижу в Citrix, без правильного исправления), вы все равно сможете закрыть форму с помощью ctrl-F4 или alt-f4. Кроме того, заявка не будет «не отвечать». Иногда порядок будет исправляться при переключении между задачами

0 голосов
/ 10 октября 2013

У нас были проблемы с OpenDialog.Execute, но только на одном компьютере - и это казалось случайным Я обнаружил, что добавление EXE DEP Windows может решить проблему у нас не было никаких проблем с момента его изменения

вот ссылка на то, как изменить настройки Windows DEP http://www.itechtalk.com/thread3591.html

это обходной путь - если кто-то знает, как поддерживать DEP, пожалуйста, добавьте комментарий ниже

0 голосов
/ 08 апреля 2013

Вы, похоже, сузили свою проблему до какой-то проблемы с доступом, поэтому следующее объяснение может вам не помочь.Но, похоже, существует проблема с всплывающими окнами в RemoteApp, и я мог предположить, что это может привести (по крайней мере теоретически) к аналогичной проблеме, поэтому я хотел бы упомянуть об этом: http://social.technet.microsoft.com/Forums/en-US/winserverTS/thread/0a88919f-2d72-4340-abd7-fbe0e9545f25/

Видимо,Z-порядок окон не всегда корректен при использовании RemoteApp.В вашем случае TOpenDialog должен быть модальным всплывающим окном.Из-за ошибки я мог представить, что TOpenDialog может появиться в фоновом режиме.Ваше главное окно останется на переднем плане, но будет отключено, поскольку TOpenDialog является модальным.В этом случае Windows может не знать, как перерисовать отключенное окно, и просто нарисовать белый прямоугольник.

0 голосов
/ 15 июля 2010

Я рекомендую вам использовать Process Explorer инструмент для просмотра свойств вашего процесса. Проверьте, какие именно библиотеки DLL загружены в обоих случаях (это можно сделать, выбрав свой процесс и открыв нижнюю панель в представлении модулей).

Вы также можете использовать Process Monitor для мониторинга запуска процесса (опять же: в обоих случаях) и просмотра любых ссылок на рассматриваемые библиотеки DLL.

...