Служба Windows при попытке получить доступ к свойству .Body объекта сообщения MSMQ выдает исключение EOleException, но только тогда, когда документ Xml, содержащийся в этом сообщении, имеет пустой узел списка.
Сообщение EOleException жалуется нанедостаточно памяти (код исключения -2147024882).Поскольку исключение происходит только с наименьшим возможным XML-документом, память не может быть реальной проблемой.Следующее, что приходит в голову, это проблема с правами доступа, но опять же все «хорошие» сообщения (как описано ниже) обрабатываются без проблем.
Исключение может быть воспроизведено при любом мыслимом условии («плохое»).сначала сообщение, сначала много «хороших» сообщений, затем «плохое» сообщение, запускаемое в отладчике или просто регистрирующее исключение);не имеет значения, выполняется ли приведенный ниже код как служба или как простой исполняемый файл.
Использование одного и того же COM-объекта (MSMQ.MSMQQueueInfo) из VBScript на той же машине не приводит к ошибкам.
Доступ к любым другим свойствам, кроме .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-разрядный стандарт).