消息队列, see System.Messaging.MessageQueue共享内存: no管道: use P/Invoke and API
解决方案 »
- c#下数据库问题
- C#访问Jar文件里面的文件
- xml文件绑到winform上的datagridview控件
- 急!!!!!C#插入图片到数据库
- oracle模糊查询中like语句包括%或者‘时如何处理?
- 我在asp.net里执行一个应用程序(非.net开发)为什么老报错?让他独立运行就没事
- 如何實現單擊主表datagrid中的記錄,另一datagrid相應顯示相關主表記錄的明細表記錄?
- 如何递归实现下述功能?(TreeNode)
- 一个简单问题,如何让程序在开始运行的时候先弹出一个图片显示软件信息?
- C# Workbooks.Open()无法打开Excel文件
- 输入框中按下向右键和向左键的代码为什么一样?
- 如何生成setup文件
消息队列,socket,管道都可以,还有web service,Enterprise Service都可以实现,甚至分布式计算(通讯)。
P/Invoke是什么?
哪些API函数用于进程间通信?
消息队列System.Messaging.MessageQueue需不需要把消息队列组件装上?
一、创建邮槽服务器
以下代码用于创建一个名叫sample_mailslot的邮槽: BOOL FAR PASCAL Makeslot( ) { // 邮槽名称都定义在\\.\mailslot\目录下 LPSTR lpszSlotName = "\\\\.\\mailslot\\sample_mailslot"; // 邮槽句柄"hSlot1" 是一个全局变量 hSlot1 = CreateMailslot(lpszSlotName,0, // 对接受的消息没有最大值限制 MAILSLOT_WAIT_FOREVER, // 没有最大读延迟时间 (LPSECURITY_ATTRIBUTES) NULL); // 无安全属性 if (hSlot1 == INVALID_HANDLE_VALUE) //创建邮槽失败 return FALSE; return TRUE; }
二、客户端与邮槽服务器通信
客户端通过API函数向邮槽发送消息,然后消息被广播到域内的每一台计算机上,但只有指定的邮槽接收这些消息。在这里要注意被广播的消息每条不能超过400个字节,但对每个邮槽能接受的消息的数量没有限制。 BOOL FAR PASCAL Writeslot( ) { BOOL fResult; HANDLE hFile; DWORD cbWritten; LPSTR lpszMessage = "Message for sample_mailslot in primary domain"; hFile = CreateFile("\\\\*\\mailslot\\sample_mailslot", GENERIC_WRITE, FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); if (hFile == INVALID_HANDLE_VALUE) // 创建客户端邮槽句柄失败 return FALSE; fResult = WriteFile(hFile, lpszMessage, (DWORD) lstrlen(lpszMessage) + 1, &&cbWritten, (LPOVERLAPPED) NULL); if (!fResult) // 发送消息错误 return FALSE; fResult = CloseHandle(hFile); return TRUE; }
三、从邮槽中读取数据
邮槽服务器通过GetMailslotInfo函数判断邮槽中是否有数据,如果有,则通过ReadFile函数从邮槽中读取。下面的代码完成从邮槽中读取一条消息。 BOOL FAR PASCAL Readslot() { DWORD cbMessage, cMessage, cbRead; BOOL fResult; LPSTR lpszBuffer; cbMessage = cMessage = cbRead = 0; //邮槽句柄hSlot1是一个全局变量 fResult = GetMailslotInfo(hSlot1, // 邮槽句柄 (LPDWORD) NULL, // 对消息的大小没有最大限制 &&cbMessage, // 下一条消息的大小 &&cMessage, // 消息的数量 (LPDWORD) NULL); if(cbMessage == MAILSLOT_NO_MESSAGE) // 邮槽内无消息 { printf( "No waiting messages."); return TRUE; } // 为消息分配内存 lpszBuffer = (LPSTR) GlobalAlloc(GPTR, cbMessage); lpszBuffer[0] = '\0'; fResult = ReadFile(hSlot1, lpszBuffer, cbMessage, &&cbRead, (LPOVERLAPPED) NULL); // 显示消息 Printf("%s",lpszBuffer); GlobalFree((HGLOBAL) lpszBuffer); return TRUE; }
MapViewOfFile
CreateMutex
WaitForSingleObject