2010-11-16 5 views
0

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).

+0

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 ?) –

+0

@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

+0

@Ken ... et pour coller avec votre photo médicale, je précise clairement ce que je fais réellement qui me fait mal. – Filburt

Répondre

0

Si le VBScript fonctionne correctement, je suppose que c'est quelque chose dans l'interaction entre MSMQ et le service Delphi.

Avez-vous essayé d'exécuter le code Delphi dans une application autonome?

Je n'ai pas encore travaillé avec MSMQ, mais vous pouvez aussi essayer d'utiliser une lecture non transactionnelle dans la file d'attente des messages pour voir si cela fait une différence (réduire le code à la taille de possible).

Une raison possible pourrait être une bibliothèque MSXML différente (plus récente) sur la machine Win2008.

+0

Nous avons déjà essayé de l'exécuter dans une application autonome. De cette façon, nous l'avons réduit à la ligne où nous accédons à la propriété .Body. MSXML ne devrait pas être le problème car à ce stade, nous traitons les données .Body comme une simple chaîne (nous avons également essayé WideString). – Filburt

+0

Laissant de côté la transaction serait simplement d'une valeur diagnostique puisque nous ne devons pas exécuter ce processus sans transactions. – Filburt

Questions connexes