Я пытаюсь реализовать приложение, которое регистрируется в качестве сервера DDE, чтобы оно правильно реагировало на наш пользовательский тип файла ".qsx", так же, как WinWord реагирует на тип файла ".docx".
т.е.
- Если приложение уже запущено и кто-то дважды щелкает файл «.qsx», мы хотим, чтобы уже открытое приложение получало команду открытия DDE и открывало соответствующий файл.
- Однако, если приложение еще не запущено, оболочка должна запустить наше приложение, а затем установить 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?