DDE: реалізація програми, яка запускається правильно через Shell та ddeexec

Я намагаюся реалізувати додаток, який зареєстрований як сервер DDE, так що він правильно відповідає нашому користувальницькому типу файлу типу .qsx, так як WinWord відповідає типу файлу .docx.

тобто

  1. Якщо програма вже запущена, а хтось двічі натискає файл ".qsx", ми хочемо, щоб вже відкрита програма одержувала команду відкрити DDE і відкрила відповідний файл.
  2. Однак, якщо програма ще не запущена, оболонка повинна запустити нашу програму, а потім встановити зв'язок DDE з додатком та повідомити йому, що він відкриває файл як і раніше.

Ми частково працюємо бездоганно.

Однак для частини 2 Shell запускає команду, але потім не вдається виконати команду «Виникла проблема з відправкою команди до програми». Це відповідає коду повернення "SE_ERR_DDEFAIL" (29), що повертається з функції "ShellExecute" Windows API.

Фактично, я написав власну консольну програму під назвою "ShellExecute.exe", яка може відтворити цю проблему саме незалежно від explorer.exe.

Якщо я запускаю ShellExecute.exe і наш додаток DDE сервера вже працює, він працює правильно. Якщо я запускаю 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
так я впевнений це зрозуміло з огляду на ключі реєстру та численні статті.
додано Автор Paul Hollingsworth, джерело
Вихідний код для ShellExecute - це не те, що вам потрібно. Що вам потрібно, це виправити ваш код. Оскільки ви не показали нам свій код, важко допомогти.
додано Автор David Heffernan, джерело
Ви впевнені, що MS Word використовує DDE, а не просто повідомляє попередній екземпляр сам, щоб відкрити файл, а потім виходить?
додано Автор hamstergene, джерело

2 Відповіді

Програми, що працюють на XP +, повинні використовувати IDropTarget , щоб уникнути проблеми з DDE, коли висять вікна.

При використанні DDE оболонка припускає <�ваш DDE сервер працює і працює, перш ніж запустити цикл повідомлення ...

5
додано

Будь ласка, не використовуйте DDE. Це смішно застарілий спосіб зробити це, що викликає всі види проблем і зависає і залежить від реєстру.

Сучасний спосіб це зробити - це глобальний мутекс. Якщо ви шукаєте переповнення стек, ви знайдете десятки людей, які задають одне й те саме питання ( можна почати тут )

1
додано
Глобальний мутекс? Як точно ви надсилаєте дані за допомогою mutex? Вам потрібно буде використовувати FindWindow + SendMessage (..., WM_COPYDATA), а потім ви повернетесь до проблем, пов'язаних із повідомленнями, які має DDE. Навіть якщо ви використовуєте mutex, воно не повинно бути глобальним (Global \ prefix), воно повинно бути для кожного користувача (Ви не хочете, щоб користувачі інших сеансів не працювали з вашим додатком)
додано Автор Anders, джерело