2016-06-25 53 views
0

把你的帽子韋巴克調用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()以獲得客戶端的功能代碼。

感謝您的幫助,您可以提供...

+0

FWIW:我寫道,如果MfcDDE是一個衆所周知的事情。爲了記錄,這是一個相對輕量級的使用Julian Smart編寫的DDE類的集合。 –

+0

我發現了一個示例DDE程序,它構建它,並能夠戳值。這似乎排除了任何安全問題。 然後我使用它在我的客戶端中使用的代碼。它調用DdeCreateStringHandle(),它也會得到DMLERR_INVALIDPARAMETER失敗。我想可能是ANSI與UNICODE。我的客戶端被構建爲ANSI。 –

+0

雖然對DdeClientTransaction(XTYP_POKE)的調用是在具有消息隊列的線程上進行的,它並不是在最初調用DdeInitialize()的同一線程上進行的。我懷疑這將是問題,正在確認中...... –

回答

0

證實,DdeClientTransaction(XTYP_POKE)只能在同一個線程在其中DDE初始化()被調用上調用。限制實際上可能與DdeConnect()被調用的線程相同,但我的錢在DdeInitialize()上,因爲返回的DDEIdInst被傳遞給DdeConnect()。我可能是錯的。

感謝你讓我和你們一起工作... :)