2015-05-08 2 views
0

У меня есть ситуация, когда мое приложение C# использует 32-битную и 64-разрядную библиотеки DLL при работе на 64-битной машине. Мой главный пользовательский интерфейс должен быть 64 бит, а дочерний диалог должен быть 32 бит. Чтобы решить эту проблему, я запускаю 32-битную версию приложения из 64-битной версии и жду, пока она выйдет. Я использую анонимные каналы, чтобы получить результаты дочернего диалога обратно в 64-битный процесс. Я передаю дескриптор родительского окна дочернему процессу, поэтому дочерний диалог из 32-битного процесса будет модальным для основного диалога в родительском процессе. Это работает очень хорошо, но проблема в том, что дочерний процесс закрывает родительское диалоговое окно в 64-битном процессе, получает сообщение WM_CLOSE, и приложение существует. Как я могу предотвратить это, сохраняя при этом диалоговое окно дочернего процесса в 32-битном процессе модально в родительском диалоговом окне в 64-битном процессе?Родительский диалог, получающий WM_CLOSE при выходе дочернего процесса

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

ответ

0

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

Чтобы решить эту проблему, я сделал следующее:

  1. вызова EnableWindow (родительский, ложь) перед началом процесса ребенка
  2. Pass основные формы обращаться в дочерний процесс в командной строке.
  3. Вызов SetWindowLong (ребенок, GWL_HWNDPARENT, родитель) на ручке диалогового окна ребенка в процессе детского
  4. Вызов EnableWindow (родитель, правда), когда дочерний процесс завершается

Все прекрасно работает в настоящее время.