CreateMsgQueue

       因为在进程间的通讯时,一般采用的方法,可以使用SendMessage/PostMessage ,但是这两种方式接收消息,是由消息循环接收的,而且还需要发送目标的一个进程句柄。在有些情况不满足的情况下,导致这种方式使用起来比较麻烦。可以使用CreateMsgQueue 创建一个点对点的消息队列,然后使用WriteMsgQueue 将你需要发送的数据写入到消息队列,获取方则通过 ReadMsgQueue 从消息队列读取由WriteMsgQueue写入的数据。
  CreateMsgQueue 创建消息队列
  函数原型
  HANDLE CreateMsgQueue(
  LPCWSTRlpszName,//队列的名称
  LPMSGQUEUEOPTIONS lpOptions//指向一个MSGQUEUEOPTIONS
  );
  用途:主要用于点对点消息队列。
 
MSDN中这样说:
Message queue messages :Register for message queue messages with RequestDeviceNotifications. Stop receiving device notifications by calling StopDeviceNotifications. 

Message queue notifications include notifications that Advertise Interface explicitly advertises and notifications that the driver's IClass registry key value implicitly advertises. IClass GUIDs can have a name associated with them. For example, "{GUID}=GUID_friendly_name".

 

实例代码:

Developing a Device Driver -> Device Driver Development Concepts -> Device Interfaces
The following code example shows a simple use of CreateMsgQueue, RequestDeviceNotifications, WaitForSingleObject, and StopDeviceNotifications.

#include <windows.h>
#include <msgqueue.h>

#include <pnp.h>

typedef union {
  DEVDETAIL d;
  char pad[sizeof(DEVDETAIL)+MAX_DEVCLASS_NAMELEN];
} MYDEV;

void EnumerateDevices (HANDLE h)
{
  MYDEV detail;
  DWORD flags;
  DWORD size;

  SetLastError(0);

  while (ReadMsgQueue(h, &detail, sizeof(detail), &size, 1, &flags) == TRUE)
  printf("Device notification: %S %s, f=0x%x\n", detail.d.szName, detail.d.fAttached ? "appeared" : "was removed", flags);

  printf("Leaving Enumerate, error = %d\n", GetLastError());
}

main ()
{
  GUID guid = {0}; // or any known and relevant device interface GUID
  HANDLE hq, hn;
  MSGQUEUEOPTIONS msgopts;

  msgopts.dwFlags = MSGQUEUE_VARIABLESIZE | MSGQUEUE_MSGSIZE;
  msgopts.dwMaxMessages = 0; //?
  msgopts.cbMaxMessage = sizeof(MYDEV);
  msgopts.cbMaxMsgQueue = 0; //?
  msgopts.dwDesiredAccess = GENERIC_READ;
  msgopts.dwShareMode = 0;
  msgopts.dwCreationDisposition = CREATE_NEW;
  hq = CreateMsgQueue(NULL, &msgopts);

  printf("Created message queue, h = %08X\n", hq);
  if (hq == 0) return 0;

  hn = RequestDeviceNotifications(&guid, hq, TRUE);

  printf("Registered for notifications, h = %08X\n", hn);

  EnumerateDevices(hq);

  printf("Completed initial notification pass.\n");

  // do whatever
  while (WaitForSingleObject(hq, 80000) == WAIT_OBJECT_0)
  EnumerateDevices(hq);

  printf("Commencing final enumeration\n");
  EnumerateDevices(hq);
  printf("Done.\n");

  StopDeviceNotifications(hn);
  CloseMsgQueue(hq);

  return 0;
}

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值