Надень Вайбак шляп ...Прием DMLERR_POSTMSG_FAILED при вызове DdeClientTransaction() с XTYP_POKE
Я должен использовать DDE (извините, абсолютно никакого выбора в этом) не общаться с системой промышленного контроля. Система управления является DDE-сервером и работает на том же ПК с Windows 7, что и мой клиент DDE. Клиент использует MfcDDE в качестве своего интерфейса, который, в свою очередь, вызывает вызовы функций .
Операции DDE, как и следовало ожидать, после вызова MfcDDE устанавливают их с помощью DdeClientTransaction(XTYP_ADVSTART
). Все данные, представляющие интерес, успешно просматриваются через механизм консультаций.
К сожалению, попытки записи данных через функцию DdeClientTransaction(XTYP_POKE)
не выполняются. В моем клиенте DdeGetLastError()
возвращает DMLERR_INVALIDPARAMETER (16390 0x4006)
. Интересно, что DDESpy (да, я такой отчаянный) сообщает DMLERR_POSTMSG_FAILED (16396 0x400C)
.
Клиент работал в своей первоначальной реализации NT, но был восстановлен и запущен под Win7, ошибка XTYPE_POKE
. Я рассматривал как безопасность, так и потоки как возможности.
Я не смог найти указательный пистолет для изменений безопасности DDE между NT и Win7.
Если это имеет значение, то DdeClientTransaction()
вызов делается в потоке начал с WinMain()
вызова до AfxWinMain()
и CDialog::DoModal()
, чтобы добраться до функционального кода клиента.
Спасибо за любую помощь вы можете предоставить ...
FWIW: Я написал, как будто MfcDDE был общеизвестный вещь. Для записи это относительно легкий набор классов MFC для использования DDE, написанный Джулианом Смарт. –
Я нашел образец DDE-программы, построил ее и смог выставить значения. Это, по-видимому, исключает любые проблемы с безопасностью. Затем я использовал код, который он использует в моем клиенте. Он вызывает вызовы DdeCreateStringHandle(), которые также получают отказ DMLERR_INVALIDPARAMETER. Я думаю, что ANSI против UNICODE. Мой клиент построен как ANSI. –
Пока вызов DdeClientTransaction (XTYP_POKE) был выполнен в потоке с очередью сообщений; он не делался в том же потоке, который первоначально назывался DdeInitialize(). Я подозреваю, что это будет проблемой, и я в процессе подтверждения ... –