尝试访问MSMQ消息对象的.Body属性时,Windows服务会抛出EOleException - 但仅当此消息中包含的Xml文档具有空列表节点时才会生成。
EOleException消息抱怨内存不足(例外代码-2147024882)。由于异常只发生在尽可能小的Xml文档中,因此内存不是真正的问题。我想到的下一件事是访问权限问题,但是所有“好”消息(如下所述)都会毫无问题地处理。
可以在任何可想象的条件下复制异常(首先是“坏”消息,首先是许多“好”消息 - 然后是“坏”消息,在调试器中运行或只是记录异常);如果下面显示的代码作为服务或简单的excecutable运行,则无关紧要。
在同一台机器上的VBScript中使用相同的COM对象(MSMQ.MSMQQueueInfo)不会产生任何错误。
访问除.Body之外的任何其他属性不会抛出异常,因此消息对象实例似乎成功接收。如果未访问.Body属性,则可以成功地接收接收消息的事务。
Windows服务代码
//...
qInfo := CreateOleObject('MSMQ.MSMQQueueInfo');
qTxDisp := CreateOleObject('MSMQ.MSMQTransactionDispenser');
//...
qTx := qTxDisp.BeginTransaction;
qMessage := qQueue.Receive(qTx, False, True, 0);
//...
sBody := qMessage.Body; //throws EOleException
qMessage.BodyLength
属性为“错误”消息返回值 165 ,如下所示。
“错误”消息
<?xml version="1.0" encoding="Windows-1252"?>
<response space="" Message="Entry_7">
<query>
<entrylist count="0">
</entrylist>
</query>
</response>
此消息可靠地使服务代码抛出EOleExecption。
“好”消息
<?xml version="1.0" encoding="Windows-1252"?>
<response space="" Message="Entry_7">
<query>
<entrylist count="2">
<entry>
<abc>123</abc>
<def>456</def>
</entry>
<entry>
<abc>789</abc>
<def>000</def>
</entry>
</entrylist>
</query>
</response>
此邮件可以正常处理而不会出现问题。
将服务从Win2003计算机移动到Win2008(32位标准版)时,首先出现问题。
答案 0 :(得分:0)
如果VBScript工作正常,那么我猜这是MSMQ和Delphi服务之间的交互。
您是否尝试在独立应用程序中运行Delphi代码?
我还没有使用MSMQ,但也许您也可以尝试使用消息队列中的非事务性读取来查看它是否有所不同(将代码减小到尽可能小/简单)。
可能的原因可能是Win2008机器上的另一个(更新的)MSXML库。