Un service Windows qui tente d'accéder à la propriété .Body d'un objet de message MSMQ lève une exception EOleException, mais uniquement lorsque le document XML contenu dans ce message contient un noeud de liste vide.EOleException lors de l'accès au corps du message
Le message EOleException se plaint de l'insuffisance de mémoire (code d'exception -2147024882). Étant donné que l'exception se produit uniquement avec le plus petit document Xml possible, la mémoire ne peut pas être le véritable problème. La prochaine chose qui vient à l'esprit est un problème avec les droits d'accès mais là encore tous les "bons" messages (comme décrit ci-dessous) sont traités sans problèmes. L'exception peut être reproduite dans n'importe quel état imaginable (message "mauvais" en premier, plusieurs "bons" messages d'abord - puis "mauvais", exécution dans le débogueur ou simplement enregistrement de l'exception); cela n'a pas d'importance si le code ci-dessous est exécuté en tant que service ou en tant que simple exécutable.
L'utilisation du même objet COM (MSMQ.MSMQQueueInfo) à partir d'un VBScript sur le même ordinateur ne génère aucune erreur.
L'accès à d'autres propriétés à l'exception de .Body ne génère pas d'exception, ce qui signifie que l'instance de l'objet message semble avoir été reçue avec succès. La transaction recevant le message peut également être validée si la propriété .Body n'est pas accédée.
Code service Windows
//...
qInfo := CreateOleObject('MSMQ.MSMQQueueInfo');
qTxDisp := CreateOleObject('MSMQ.MSMQTransactionDispenser');
//...
qTx := qTxDisp.BeginTransaction;
qMessage := qQueue.Receive(qTx, False, True, 0);
//...
sBody := qMessage.Body; //throws EOleException
La propriété qMessage.BodyLength
renvoie la valeur pour les messages "mauvais" comme indiqué ci-dessous.
un message
<?xml version="1.0" encoding="Windows-1252"?>
<response space="" Message="Entry_7">
<query>
<entrylist count="0">
</entrylist>
</query>
</response>
"Bad" Ce message fait de manière fiable le code de service jeter un EOleExecption.
"Good" un message
<?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>
Ce message est fiable traité sans problème.
Le problème est survenu lors du transfert du service d'une machine Win2003 à une Win2008 (norme 32 bits).
Qu'est-ce que "OLE Exception" lance-t-il? Quel est le message d'erreur exact? Sans les détails, votre question est beaucoup plus difficile à répondre - il y a des dizaines (sinon des centaines) de raisons EOleException, et le message d'erreur exact aidera à affiner cela.(Poster cette question de type, c'est comme appeler le bureau de votre médecin et dire: «Je ne me sens pas bien Quel type de médicament ai-je besoin?" - vous n'obtiendrez pas de réponse sans beaucoup plus d'informations que cela, êtes-vous ?) –
@Ken Votre commentaire semble un peu dur parce que j'ai fourni une bonne partie de plus d'informations que tous ces posts qui ne font que répéter le titre dans le corps. Cependant, je n'ai pas fourni le message d'exception. Comme vous pouvez le voir dans ma mise à jour, le message indique que le problème est une mémoire insuffisante qui est un non-sens. – Filburt
@Ken ... et pour coller avec votre photo médicale, je précise clairement ce que je fais réellement qui me fait mal. – Filburt