2016-06-25 17 views
0

Надень Вайбак шляп ...Прием 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(), чтобы добраться до функционального кода клиента.

Спасибо за любую помощь вы можете предоставить ...

+0

FWIW: Я написал, как будто MfcDDE был общеизвестный вещь. Для записи это относительно легкий набор классов MFC для использования DDE, написанный Джулианом Смарт. –

+0

Я нашел образец DDE-программы, построил ее и смог выставить значения. Это, по-видимому, исключает любые проблемы с безопасностью. Затем я использовал код, который он использует в моем клиенте. Он вызывает вызовы DdeCreateStringHandle(), которые также получают отказ DMLERR_INVALIDPARAMETER. Я думаю, что ANSI против UNICODE. Мой клиент построен как ANSI. –

+0

Пока вызов DdeClientTransaction (XTYP_POKE) был выполнен в потоке с очередью сообщений; он не делался в том же потоке, который первоначально назывался DdeInitialize(). Я подозреваю, что это будет проблемой, и я в процессе подтверждения ... –

ответ

0

подтвердил, что DdeClientTransaction (XTYP_POKE) можно назвать только в том же потоке, на котором был назван DdeInitialize(). Ограничением может быть тот же самый поток, на который был вызван DdeConnect(), но мои деньги находятся на DdeInitialize(), поскольку возвращаемый DDEIdInst передается DdeConnect(). Я могу ошибаться.

Спасибо за разрешение мне работать через это с вами, ребята ... :)