using System; using System.Collections.Generic; using System.Messaging; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication5 { [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct tagRoomInfo { string szGwAddress; //GWIP int iGSNo; //GS序号 string szGSName; //GS名称 string szGSAddress; //GSIP int iChannelNo; //频道序号 string szChannelName; //频道名 int usRoomNo; //房间号 string szRoomName; //房间名 string szTime; //数据采集时间 } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct test { public int test11; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] public byte[] test12; }; public class QueueManage { /// /// 发送对象到队列中 /// /// //队列名称,因为队列名称在一个应用中应该不改变的,所以大家最好写在配置文件中 /// //要发出去的对象 public static void SendQueue(string QueuePath, System.Messaging.Message msg) { System.Messaging.MessageQueue mqSend = new System.Messaging.MessageQueue(QueuePath, false); EnsureQueueExists(QueuePath); mqSend.Send(msg); } /// /// 检查队列,如果队列不存在,则建立 /// /// //队列名称 private static void EnsureQueueExists(string path) { if (!MessageQueue.Exists(path)) { if (!MessageQueue.Exists(path)) { MessageQueue.Create(path); MessageQueue mqTemp = new MessageQueue(path); mqTemp.SetPermissions("Everyone", System.Messaging.MessageQueueAccessRights.FullControl); } } } /// /// 从队列中取出对象列表 /// /// //队列名称 public static System.Collections.ArrayList GetMessage(string QueuePath) { tagRoomInfo Room = new tagRoomInfo(); System.Type[] arrTypes1 = new System.Type[1]; arrTypes1[0] = Room.GetType(); byte[] result; //System.Messaging.Message msg = new System.Messaging.Message(); System.Messaging.MessageQueue mq = new System.Messaging.MessageQueue(QueuePath, false); mq.MessageReadPropertyFilter.Body = true; mq.MessageReadPropertyFilter.AppSpecific = true; mq.DefaultPropertiesToSend.UseJournalQueue = false; System.Messaging.Message[] arrM = mq.GetAllMessages(); mq.Close(); System.Collections.ArrayList al = new System.Collections.ArrayList(); foreach (System.Messaging.Message m in arrM) { try { test t = new test(); System.Messaging.Message msg = mq.Receive(); result = new byte[int.Parse(msg.BodyStream.Length.ToString())]; msg.BodyStream.Read(result, 0, result.Length); t = (test)BytesToStruct(result, t.GetType()); // 将字节数组转换成结构 string tt = System.Text.Encoding.Default.GetString(t.test12); int ttt = t.test11; } catch (System.Exception ex) { Console.WriteLine(ex.Message); } } return al; } /// byte数组转结构 /// /// byte数组 /// 结构类型 /// 转换后的结构 public static object BytesToStruct(byte[] bytes, Type type) { //得到结构的大小 int size = Marshal.SizeOf(type); //Log(size.ToString(), 1); //byte数组长度小于结构的大小 if (size > bytes.Length) { //返回空 return null; } //分配结构大小的内存空间 IntPtr structPtr = Marshal.AllocHGlobal(size); //将byte数组拷到分配好的内存空间 Marshal.Copy(bytes, 0, structPtr, size); //将内存空间转换为目标结构 object obj = Marshal.PtrToStructure(structPtr, type); //释放内存空间 Marshal.FreeHGlobal(structPtr); //返回结构 return obj; } } } 用c#读取c++导入的msmq结构体,接下来就要用线程池或者自身开线程跑了,以下是c++导入代码 // client.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <vector> #include <string> using namespace std; #include <windows.h> #include <stdio.h> #include <atlbase.h> // for printf #import "mqoa.dll" no_namespace typedef struct { int test1; char str[100]; }test; int main() { OleInitialize(NULL); try { IMSMQQueueInfoPtr qinfo("MSMQ.MSMQQueueInfo"); IMSMQQueuePtr qSend; IMSMQMessagePtr m("MSMQ.MSMQMessage"); qinfo->PathName = ".//testqueue"; try { qinfo->Create(); } catch (_com_error comerr) { HRESULT hr = comerr.Error(); if (hr == MQ_ERROR_QUEUE_EXISTS) { printf("Opening existing queue./n"); } else { throw comerr; } }; qSend = qinfo->Open(MQ_SEND_ACCESS, MQ_DENY_NONE); test aa; strcpy(aa.str, "nihao"); aa.test1 = 11; SAFEARRAY* psa; SAFEARRAYBOUND rgsabound[1]; rgsabound[0].lLbound = 0; rgsabound[0].cElements = sizeof(test); psa = SafeArrayCreate(VT_UI1, 1, rgsabound); void *Dest; SafeArrayAccessData(psa,(void**) &Dest); memcpy( Dest , &aa , sizeof(test)); SafeArrayUnaccessData(psa); VARIANT varBLOB; VariantInit(&varBLOB); V_VT(&varBLOB) = VT_ARRAY|VT_UI1; V_ARRAY(&varBLOB)= psa; m->Body = varBLOB; m->Send(qSend); printf("Message was sent./n"); qSend->Close(); return 0; } catch (_com_error comerr) { HRESULT hr = comerr.Error(); printf("unexpected error: %x/n", hr); exit(-1); // failure } }