把你的帽子韋巴克調用DdeClientTransaction()當接收DMLERR_POSTMSG_FAILED ...與XTYP_POKE
我必須使用DDE(對不起,在這個絕對沒有選擇)與工業控制系統通信。控制系統是DDE服務器,與我的DDE客戶端在相同的Windows 7 PC上運行。客戶端使用MfcDDE作爲其接口,從而調用DdeClientTransaction()
函數。
DDE建議操作在調用MfcDDE與DdeClientTransaction(XTYP_ADVSTART
建立它們後按預期工作)。所有感興趣的數據點均通過建議機制成功讀取。
不幸的是,嘗試通過DdeClientTransaction(XTYP_POKE)
函數寫入數據失敗。在我的客戶端,DdeGetLastError()
返回DMLERR_INVALIDPARAMETER (16390 0x4006)
。有趣的是,DDESpy(是的,我是那個絕望)報告DMLERR_POSTMSG_FAILED (16396 0x400C)
。
客戶端在其最初的NT實現中工作,但在Win7下重建並運行,XTYPE_POKE
失敗。我已經將安全和線程都視爲可能性。
我一直沒有找到在NT和Win7之間的DDE安全更改的指點槍。
如果重要,DdeClientTransaction()
呼叫正在以WinMain()
開頭的線程進行調用,直到AfxWinMain()
和CDialog::DoModal()
以獲得客戶端的功能代碼。
感謝您的幫助,您可以提供...
FWIW:我寫道,如果MfcDDE是一個衆所周知的事情。爲了記錄,這是一個相對輕量級的使用Julian Smart編寫的DDE類的集合。 –
我發現了一個示例DDE程序,它構建它,並能夠戳值。這似乎排除了任何安全問題。 然後我使用它在我的客戶端中使用的代碼。它調用DdeCreateStringHandle(),它也會得到DMLERR_INVALIDPARAMETER失敗。我想可能是ANSI與UNICODE。我的客戶端被構建爲ANSI。 –
雖然對DdeClientTransaction(XTYP_POKE)的調用是在具有消息隊列的線程上進行的,它並不是在最初調用DdeInitialize()的同一線程上進行的。我懷疑這將是問題,正在確認中...... –