2008-09-23 6 views
3

Est-ce que quelqu'un peut me donner des exemples pratiques de la façon dont vous pouvez créer, ajouter des messages, lire et détruire une file d'attente de messages privés à partir d'API C++? J'ai essayé les morceaux de code de MSDN mais je ne peux pas les faire fonctionner correctement.Échantillons MSMQ en C++?

Merci

+0

Quels problèmes rencontrez-vous avec l'exemple de code MSDN? Si vous avez publié les erreurs, nous pourrions avoir plus de chance de vous aider. –

+0

Je suis d'accord avec Seb, pourriez-vous clarifier un peu votre question? –

Répondre

-1

Pas tout à fait sûr de savoir comment vous iriez sur la création ou la destruction des files d'attente de messages. Windows devrait en créer un par thread.

Si vous utilisez MFC, toutes les classes dérivées CWinThread et CWnd disposent d'une file d'attente de messages d'accès trivial (utilisant PostMessage ou PostThreadMessage et la macro ON_COMMAND). Pour faire quelque chose de similaire avec l'API Windows, je pense que vous devez écrire votre propre pompe de message, quelque chose comme la méthode d'exécution de CWinApp.

MSG msg; 
BOOL bRet; 
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) 
{ 
    if (bRet == -1) 
    { 
     // handle the error and possibly exit 
    } 
    else 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

... est l'exemple de la documentation MSDN. Est-ce ce que vous utilisez? Qu'est-ce qui ne fonctionne pas?

+1

Il fait référence à MSMQ, pas à la fenêtre Proc. –

2

c'est le actualy code que je me suis intéressé à:

#include "windows.h" 
#include "mq.h" 
#include "tchar.h" 


HRESULT CreateMSMQQueue(
         LPWSTR wszPathName, 
         PSECURITY_DESCRIPTOR pSecurityDescriptor, 
         LPWSTR wszOutFormatName, 
         DWORD *pdwOutFormatNameLength 
         ) 
{ 

    // Define the maximum number of queue properties. 
    const int NUMBEROFPROPERTIES = 2; 


    // Define a queue property structure and the structures needed to initialize it. 
    MQQUEUEPROPS QueueProps; 
    MQPROPVARIANT aQueuePropVar[NUMBEROFPROPERTIES]; 
    QUEUEPROPID aQueuePropId[NUMBEROFPROPERTIES]; 
    HRESULT  aQueueStatus[NUMBEROFPROPERTIES]; 
    HRESULT  hr = MQ_OK; 


    // Validate the input parameters. 
    if (wszPathName == NULL || wszOutFormatName == NULL || pdwOutFormatNameLength == NULL) 
    { 
    return MQ_ERROR_INVALID_PARAMETER; 
    } 



    DWORD cPropId = 0; 
    aQueuePropId[cPropId] = PROPID_Q_PATHNAME; 
    aQueuePropVar[cPropId].vt = VT_LPWSTR; 
    aQueuePropVar[cPropId].pwszVal = wszPathName; 
    cPropId++; 

    WCHAR wszLabel[MQ_MAX_Q_LABEL_LEN] = L"Test Queue"; 
    aQueuePropId[cPropId] = PROPID_Q_LABEL; 
    aQueuePropVar[cPropId].vt = VT_LPWSTR; 
    aQueuePropVar[cPropId].pwszVal = wszLabel; 
    cPropId++; 



    QueueProps.cProp = cPropId;    // Number of properties 
    QueueProps.aPropID = aQueuePropId;  // IDs of the queue properties 
    QueueProps.aPropVar = aQueuePropVar;  // Values of the queue properties 
    QueueProps.aStatus = aQueueStatus;  // Pointer to the return status 



    WCHAR wszFormatNameBuffer[256]; 
    DWORD dwFormatNameBufferLength = sizeof(wszFormatNameBuffer)/sizeof(wszFormatNameBuffer[0]); 
    hr = MQCreateQueue(pSecurityDescriptor,   // Security descriptor 
        &QueueProps,     // Address of queue property structure 
        wszFormatNameBuffer,   // Pointer to format name buffer 
        &dwFormatNameBufferLength); // Pointer to receive the queue's format name length 



    if (hr == MQ_OK || hr == MQ_INFORMATION_PROPERTY) 
    { 
    if (*pdwOutFormatNameLength >= dwFormatNameBufferLength) 
    { 
     wcsncpy_s(wszOutFormatName, *pdwOutFormatNameLength - 1, wszFormatNameBuffer, _TRUNCATE); 

     wszOutFormatName[*pdwOutFormatNameLength - 1] = L'\0'; 
     *pdwOutFormatNameLength = dwFormatNameBufferLength; 
    } 
    else 
    { 
     wprintf(L"The queue was created, but its format name cannot be returned.\n"); 
    } 
    } 
    return hr; 
} 

Cela crée sans doute une file d'attente ... mais il y a des pièces manquantes pour que cela fonctionne, c'est pourquoi je besoin d'un exemple simple qui fonctionne.

+0

Quelle partie ne fonctionne pas? MQCreateQueue retourne une erreur ou le problème survient-il plus bas? – jeffm