MSMQ学习笔记二——创建Message Queue队列

一、创建Message Queue队列的主要流程

  1、定义MQQUEUEPROPS 结构;

  2、设置消息队列属性;

  3、初始化MQQUEUEPROPS 结构;

  4、调用MQCreateQueue创建队列。

  下面对MSDN上的创建Message Queue队列示例函数:

HRESULT CreateMSMQQueue(
                        LPWSTR wszPathName,
                        PSECURITY_DESCRIPTOR pSecurityDescriptor,
                        LPWSTR wszOutFormatName,
                        DWORD *pdwOutFormatNameLength
                        )
{
    // Define the maximum number of queue properties.
    const int NUMBEROFPROPERTIES = 2;
    const int BUFLEN = 256;

    // 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;
    }

    // Set queue properties.
    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++;

    // Initialize the MQQUEUEPROPS structure.
    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

    // Call MQCreateQueue to create the queue.
    WCHAR wszFormatNameBuffer[BUFLEN];
    DWORD dwFormatNameBufferLength = BUFLEN;
    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 in Unicode characters not bytes.

    // Return the format name if the queue is created successfully.
    if (hr == MQ_OK || hr == MQ_INFORMATION_PROPERTY)
    {
        if (*pdwOutFormatNameLength >= dwFormatNameBufferLength)
        {
            wcsncpy_s(wszOutFormatName, *pdwOutFormatNameLength - 1, wszFormatNameBuffer, _TRUNCATE);
            // ************************************
            // You must copy wszFormatNameBuffer into the
            // wszOutFormatName buffer.
            // ************************************
            wszOutFormatName[*pdwOutFormatNameLength - 1] = L‘\0‘;
            *pdwOutFormatNameLength = dwFormatNameBufferLength;
        }
        else
        {
            wprintf(L"The queue was created, but its format name cannot be returned.\n");
        }
    }
    return hr;
}

注意:需要包含头文件windows.h、mq.h、stdio.h和lib库mqrt.lib。

二、示例

  以下为测试示例:

int _tmain(int argc, _TCHAR* argv[])
{
    wchar_t name[]=L".\\PRIVATE$\\ZHXL.121";
    DWORD bufferLength = 256;
    wchar_t formattedQueueName[256]; 

    HRESULT returnValue = CreateMSMQQueue(name,NULL,formattedQueueName,&bufferLength);

    if(returnValue != MQ_OK)
    wprintf(L"Creating a Queue failed\n");
    else
    {
     wprintf(L"Queue was successfully created..Formatted QueueName =%s\n",formattedQueueName);
     wprintf(L"BufferLength returned is %d\n", bufferLength);
    }

    return 0;
}

  运行结果为:

三、补充

  1、MQQUEUEPROPS结构体

  该结构体定义为:

typedef struct tagMQQUEUEPROPS
{
    DWORD           cProp;
    __field_ecount(cProp) QUEUEPROPID*    aPropID;
    __field_ecount(cProp) MQPROPVARIANT*  aPropVar;
    __field_ecount_opt(cProp) HRESULT*        aStatus;
} MQQUEUEPROPS;

  cProp:属性总个数;

  aPropID:属性标识符,Message Queue必需属性的标识符有PROPID_Q_PATHNAME和PROPID_Q_LABEL两个,分别为指定队列的路径和描述性标签;

  aPropVar:消息队列属性的值;

  2、消息队列创建之后一直存在,创建同名消息队列会失败,需要用到指定队列时所需操作为打开制定队列,利用完事后关闭队列。

时间: 2024-12-04 19:46:10

MSMQ学习笔记二——创建Message Queue队列的相关文章

Quick cocos2dx-Lua(V3.3R1)学习笔记(二)----创建新项目

打开player,我们点击[新建项目]看到 第一个输入框是输入我们项目路径 第二个输入包的名字(com.公司名.gamges.项目名称) ok,填写完毕,右下角创建项目吧 .........................控制台输出结束,我们发现Create Project按钮变成Open了. 点击open,我们查看效果 果然,你们真的逃脱不了这个梗吗?Hello World,不能换点其他玩意么,比如 你吃了么O(∩_∩)O 是不是觉得这个窗口超级大啊,我的眼睛难以承受啊, 点击view按钮,里

Sharepoint2013搜索学习笔记之创建搜索服务(二)

第一步,进入管理中心,点击管理服务器上的服务 第二步,在服务器上选择需要承载搜索服务的服务器,并启动服务列表上的sharepoint server search 第三步,从管理中心进入管理服务应用程序 第四步,新建search service application 第五步,在弹出的新建窗口分别填好相应信息点击确定,主要注意的是 应用程序池可以选择已经有的,也可以自己填一个新的名称,选择填写新的之后,程序会在稍后新建一个应用程序池,一般推荐新建应用程序池. 默认情况,爬网组件会用配置好的搜索服务

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

Cookie学习笔记二:Cookie实例

今天说说刚刚学到的两个Cookie的最经典应用:自动登录和购物车设置 一:自动登录 需要两个页面:login.jsp与index.jsp,login.jsp用来输出登录信息,index.jsp处理登录信息:如果有Cookie,则自动登录,否则创建输入信息的对象的Cookie,下次登录可以直接登录,但是我们在这里给Cookie设置一个最大保存时间30s,即登录30s后会自动退回到登陆页面,具体代码如下: login.jsp: <%@ page language="java" con

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

Android学习笔记二十之Toast吐司.Notification通知.PopupWindow弹出窗 Toast吐司 Toast吐司是我们经常用到的一个控件,Toast是AndroidOS用来显示消息的一种机制,它与Dialog不同,Toast不会获取到焦点,通常显示一段时间之后就会自动消失,下面我们来介绍Toast的几种常用方式: 第一种,默认显示方式,也是最常用的方式: Toast.makeText(MainActivity.this, "这是默认的显示方式", Toast.LE

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource