DDE: Реализация приложения, которое правильно запускается через Shell и ddeexec - PullRequest
2 голосов
/ 28 октября 2011

Я пытаюсь реализовать приложение, которое регистрируется в качестве сервера DDE, чтобы оно правильно реагировало на наш пользовательский тип файла ".qsx", так же, как WinWord реагирует на тип файла ".docx".

т.е.

  1. Если приложение уже запущено и кто-то дважды щелкает файл «.qsx», мы хотим, чтобы уже открытое приложение получало команду открытия DDE и открывало соответствующий файл.
  2. Однако, если приложение еще не запущено, оболочка должна запустить наше приложение, а затем установить DDE-соединение с приложением и попросить его открыть файл, как и раньше.

У нас часть 1 работает безупречно.

Однако для части 2 командная консоль запускает команду, но затем завершается неудачно с сообщением «Произошла ошибка при отправке команды в программу». Это соответствует коду возврата "SE_ERR_DDEFAIL" (29), возвращенному функцией Windows Shell "ShellExecute".

На самом деле я написал собственное консольное приложение под названием ShellExecute.exe, которое может воспроизводить эту проблему совершенно независимо от explorer.exe.

Если я запускаю ShellExecute.exe и наше приложение "DDE server" уже запущено, оно работает правильно. Если я запускаю ShellExecute.exe для документа «.docx» и WinWord не запускается, WinWord запускается правильно и загружает документ Если я запускаю ShellExecute.exe для нашего документа «.qsx», а наше приложение не запускается, ShellExecuteEx запускает приложение, но немедленно возвращается с SE_ERR_DDEFAIL, прежде чем наше серверное приложение даже получило возможность зарегистрироваться в качестве сервера DDE .

Почему-то кажется, что для WinWord ShellExecute ждет его запуска.

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

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

Может ли кто-нибудь объяснить в деталях, что ShellExecute делает для запуска приложения и как, в частности, он знает, как «ждать», пока приложение зарегистрируется в качестве сервера DDE?

Ответы [ 2 ]

5 голосов
/ 29 октября 2011

Приложения, работающие на XP +, должны использовать IDropTarget , чтобы избежать проблем с DDE при зависших окнах.

При использовании DDE оболочка предполагает ваш сервер DDEи запустить, прежде чем начать цикл сообщений ...

0 голосов
/ 28 октября 2011

Пожалуйста, не используйте DDE.Это смехотворно устаревший способ сделать это, который вызывает всевозможные проблемы и зависает и зависит от реестра.

Современный способ сделать это - использовать глобальный мьютекс.Если вы выполните поиск по переполнению стека, вы найдете десятки людей, задающих один и тот же вопрос ( возможно, начните здесь )

...