CreateMsgQueue

来源:互联网 发布:车铣复合加工中心编程 编辑:程序博客网 时间:2024/06/05 16:33
       因为在进程间的通讯时,一般采用的方法,可以使用SendMessage/PostMessage ,但是这两种方式接收消息,是由消息循环接收的,而且还需要发送目标的一个进程句柄。在有些情况不满足的情况下,导致这种方式使用起来比较麻烦。可以使用CreateMsgQueue 创建一个点对点的消息队列,然后使用WriteMsgQueue 将你需要发送的数据写入到消息队列,获取方则通过 ReadMsgQueue 从消息队列读取由WriteMsgQueue写入的数据。
  CreateMsgQueue 创建消息队列
  函数原型
  HANDLE CreateMsgQueue(
  LPCWSTRlpszName,//队列的名称
  LPMSGQUEUEOPTIONSlpOptions//指向一个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;
}

 


原创粉丝点击