与XTYP_POKE

问题描述:

把你的帽子韦巴克调用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()的同一线程上进行的。我怀疑这将是问题,正在确认中...... –

证实,DdeClientTransaction(XTYP_POKE)只能在同一个线程在其中DDE初始化()被调用上调用。限制实际上可能与DdeConnect()被调用的线程相同,但我的钱在DdeInitialize()上,因为返回的DDEIdInst被传递给DdeConnect()。我可能是错的。

感谢你让我和你们一起工作... :)