进行间可以通过剪贴板,匿名管道,命名管道或邮槽进行通信。命名管道服务器的创建:首先创建命名管道句柄(格式:\\<SERVERADDRESS>\PIPE\<PIPENAME>),然后连接命名管道(如果使用重叠对象,ConnectNamedPipe函数调用完成之后立即返回),接着等待客户端连接(当客户端连接服务器成功后,系统将会设置重叠对象中的事件对象为有信号),最后通过WriteFile或ReadFile进行命名管道读或写操作与客户端通信。命名管道客户端的创建:首先等待命名管道(连接成功之后方可进行下一步操作),接着调用CreateFile创建命名管道句柄,最后通过WriteFile或ReadFile进行命名管道读或写操作与服务器通信。
//
// Np : NamedPipe
//
#include <windows.h>
HANDLE g_hNpServer = INVALID_HANDLE_VALUE;
HANDLE g_hNpClient = INVALID_HANDLE_VALUE;
static LPCTSTR g_szNpName = _T("\\\\.\\PIPE\\Server"); // 命名管道名称
/// <summary>创建命名管道服务端</summary>
/// <return>是否创建成功</return>
BOOL CreateNpServer()
{
g_hNpServer = CreateNamedPipe(g_szNpName, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
0, 1, 1024, 1024, NMPWAIT_WAIT_FOREVER, NULL);
OVERLAPPED overlapped;
memset(&overlapped, 0, sizeof(OVERLAPPED));
overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
ConnectNamedPipe(g_hNpServer, &overlapped);
WaitForSingleObject(overlapped.hEvent, INFINITE);
return TRUE;
}
/// <summary>创建命名管道客户端</summary>
/// <return>是否创建成功</return>
BOOL CreateNpClient()
{
WaitNamedPipe(g_szNpName, NMPWAIT_WAIT_FOREVER);
g_hNpClient = CreateFile(g_szNpName, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
return TRUE;
}