发送进程:

// LocalProcessDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "LocalProcess.h"
#include "LocalProcessDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// 对话框数据
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CLocalProcessDlg 对话框




CLocalProcessDlg::CLocalProcessDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLocalProcessDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CLocalProcessDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CLocalProcessDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BTN_SEND, &CLocalProcessDlg::OnBnClickedBtnSend)
ON_BN_CLICKED(IDC_BUTTON8, &CLocalProcessDlg::OnBnClickedButton8)
ON_BN_CLICKED(IDC_BUTTON3, &CLocalProcessDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON7, &CLocalProcessDlg::OnBnClickedButton7)
ON_BN_CLICKED(IDC_BUTTON6, &CLocalProcessDlg::OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON2, &CLocalProcessDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON4, &CLocalProcessDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON5, &CLocalProcessDlg::OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON16, &CLocalProcessDlg::OnBnClickedButton16)
ON_BN_CLICKED(IDC_BUTTON10, &CLocalProcessDlg::OnBnClickedButton10)
ON_BN_CLICKED(IDC_BUTTON11, &CLocalProcessDlg::OnBnClickedButton11)
ON_BN_CLICKED(IDC_BUTTON9, &CLocalProcessDlg::OnBnClickedButton9)
ON_BN_CLICKED(IDC_BUTTON15, &CLocalProcessDlg::OnBnClickedButton15)
ON_BN_CLICKED(IDC_BUTTON14, &CLocalProcessDlg::OnBnClickedButton14)
END_MESSAGE_MAP()


// CLocalProcessDlg 消息处理程序

BOOL CLocalProcessDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

void CLocalProcessDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。

void CLocalProcessDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CLocalProcessDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}


void CLocalProcessDlg::OnBnClickedBtnSend()
{
// TODO: 在此添加控件通知处理程序代码
HWND hWnd=::FindWindow(NULL,"TestProcess");
if(hWnd!=NULL)
{
COPYDATASTRUCT cpd; /*给COPYDATASTRUCT结构赋值*/
cpd.dwData = 0;
cpd.cbData = strlen("hello copy_data")+1;
cpd.lpData = (void*)"hello copy_data";
::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd);//发送!
}
}

//$文件映射-常用方式
void CLocalProcessDlg::FileMapping(void)
{
//打开共享的文件对象。
m_hMapFile = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,_T("TestFileMap"));
if (m_hMapFile)
{
//显示共享的文件数据。
LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);
OutputDebugString(lpMapAddr);
}
else
{
//创建共享文件。
m_hMapFile = ::CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 1024, "TestFileMap");
//拷贝数据到共享文件里。
LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);

StrCpy(lpMapAddr,"hello file map");
FlushViewOfFile(lpMapAddr,sizeof "hello file map");
}
}

//$共享内存-文件映射使用该方式实现
#define BUFFER_SIZE 1024
const UINT wm_nMemMsg=RegisterWindowMessage("mem_data");
void CLocalProcessDlg::OnBnClickedButton8()
{
// TODO: 在此添加控件通知处理程序代码
CWnd *pWnd=CWnd::FindWindow(NULL, _T("TestProcess")); //查找Recieve进程
if(pWnd==NULL)
{
AfxMessageBox(_T("寻找接收消息窗口失败!"));
return;

}

DWORD dwProcessID; //获取进程号
GetWindowThreadProcessId(pWnd->m_hWnd, (DWORD*)&dwProcessID);

//HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS,FALSE,PID);

//为保证OpenProcess函数调用成功,用户所影响的进程必须由上述标志创建。
HANDLE hProcess=OpenProcess(
STANDARD_RIGHTS_REQUIRED|
PROCESS_VM_READ|
PROCESS_VM_WRITE|
PROCESS_VM_OPERATION,//访问权限
FALSE,//继承关系
dwProcessID);//进程ID

//分配虚拟内存
LPVOID lpBaseAddress = VirtualAllocEx(hProcess, 0, BUFFER_SIZE,MEM_COMMIT, PAGE_READWRITE);

char data[BUFFER_SIZE];

strcpy(data,"hello memshare");

//把字符串写入hProcess进程的内存

WriteProcessMemory(hProcess, lpBaseAddress, data, BUFFER_SIZE, NULL);

//发送基址给Recieve进程

pWnd->SendMessage(wm_nMemMsg, NULL,(LPARAM)lpBaseAddress);

Sleep(500); //等待接收程序接收数据

VirtualFreeEx(hProcess,lpBaseAddress, 0, MEM_RELEASE); //释放虚拟内存
}

void CLocalProcessDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
FileMapping();
}

void CLocalProcessDlg::OnBnClickedButton7()
{
// TODO: 在此添加控件通知处理程序代码
HANDLE hPipe =CreateNamedPipe("\\\\.\\pipe\\MyPipe",
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
0,1,1024,1024,0,NULL);

if(INVALID_HANDLE_VALUE==hPipe)
{
AfxMessageBox("创建命名管道失败!");
hPipe=NULL;
return;
}

HANDLE hEvent;
hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(!hEvent)
{
AfxMessageBox("创建事件对象失败!");
CloseHandle(hPipe);
hPipe=NULL;
return;
}

OVERLAPPED ovlap;
ZeroMemory(&ovlap,sizeof(OVERLAPPED));
ovlap.hEvent=hEvent;
if(!ConnectNamedPipe(hPipe,&ovlap))
{
if(ERROR_IO_PENDING!=GetLastError())
{
AfxMessageBox("等待客户端连接失败!");
CloseHandle(hPipe);
CloseHandle(hEvent);
hPipe=NULL;

return;
}
}

if(WAIT_FAILED==WaitForSingleObject(hEvent,INFINITE))
{
AfxMessageBox("等待对象失败!");
CloseHandle(hPipe);
CloseHandle(hEvent);
hPipe=NULL;
return;
}

char * buf = "hello mypipe";

DWORD dwWrite;

if(!WriteFile(hPipe,buf,strlen(buf)+1,&dwWrite,NULL))
{
AfxMessageBox("写入数据失败!");
return;
}
CloseHandle(hEvent);
}

void CLocalProcessDlg::OnBnClickedButton6()
{
// TODO: 在此添加控件通知处理程序代码
if(OpenClipboard())
{
HANDLE hClip;
char *pBuf;
EmptyClipboard();

CString strsend = "hello clipboard";
hClip=GlobalAlloc(GMEM_MOVEABLE,strsend.GetLength()+1);

pBuf=(char*)GlobalLock(hClip); //将句柄转换为指针

strcpy(pBuf,strsend);

GlobalUnlock(hClip);
SetClipboardData(CF_TEXT,hClip);

CloseClipboard();
}
else
{
AfxMessageBox(_T("打开剪切板失败!"));
}
}

#include "../ShareDLL/ShareDLL.h"
#pragma comment(lib, "../Debug/ShareDLL.lib")

void CLocalProcessDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
/*HMODULE hLib=LoadLibrary("..\\Debug\\Win32dll.dll");
if(NULL==hLib)
{
AfxMessageBox("LoadLibrary failed\n");
return ;
}*/
char *strdata = "hello dll";
SetData(strdata);
}

void CLocalProcessDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
HANDLE hRead,hWrite ;
SECURITY_ATTRIBUTES sa={0};
sa.bInheritHandle=TRUE ;
sa.lpSecurityDescriptor=NULL ;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);

::CreatePipe(&hRead, //返回管读取句柄
&hWrite, //返回管道写句柄
&sa,//SECURITY_ATTRIBUTES结构体指针 一定不能为NULL否则子进程不能继承返回的句柄
0//管道的buffer大小 0表示默认大小
) ;

PROCESS_INFORMATION pp={0};//接收进程信息
STARTUPINFO si ={0}; //表示子进程如何显示
si.cb=sizeof(STARTUPINFO) ;//大小
//$设置STARTF_USESHOWWINDOW将无法通信成功
si.dwFlags=/*STARTF_USESHOWWINDOW*/ STARTF_USESTDHANDLES ;//指定那些可用
si.hStdInput=hRead ;//设置标准输入句柄 为管道读取句柄
si.hStdOutput=hWrite ;//设置标准输出句柄为管道写句柄
si.hStdError=::GetStdHandle(STD_ERROR_HANDLE) ;//调用函数获得标准错误句柄
CreateProcess("RecvProcess.exe",//可执行模块的完整路径
NULL ,//命令行参数
NULL,//默认安全结构属性 NULL
NULL,//同上
TRUE,//子进程是否从Calling他的进程继承句柄
0,//表示启动进程时的附加标记 这里我们只是创建一个进程设置为 0即可
NULL,//表示新进程使用的内存块 NULL表示子进程使用父进程的内存块
NULL,//表示启动时子进程的路径名 如果为NULL表示子进程和父进程使用相同的路径名
&si ,//表示子进程如何显示 还有为标准输入输出 标准错误句柄赋值为管道句柄
&pp) ;//LPPROCESS_INFORMATION 结构体用来接收创建的子进程的信息

char *buf = "hello nomanepipe";
DWORD dwWrite;
if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL))
{
AfxMessageBox("写入数据失败!");
return;
}
}

void CLocalProcessDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
HANDLE Mailslot;
DWORD BytesWritten;
char szServerName[256];

CString strMsg;
if ((Mailslot = CreateFileA("\\\\.\\Mailslot\\Myslot",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)) == INVALID_HANDLE_VALUE)
{
strMsg.Format("CreateFile failed with Error:%d\n",GetLastError());
AfxMessageBox(strMsg);
return ;
}

if (WriteFile(Mailslot,"hello mailslot", sizeof "hello mailslot",&BytesWritten,NULL) == 0)
{
strMsg.Format("WriteFile with error:%d\n",GetLastError());
AfxMessageBox(strMsg);
return ;
}
}

void CLocalProcessDlg::OnBnClickedButton16()
{
// C++有对soap协议的封装,gsoap网上资料很多,实例也很多,由于实现较麻烦,这里不再复述

//1.由于 WebService 经由web服务器发布,所以比DCOM而言,可以顺利穿过防火墙。
// 这也是 WebService 的优点之一,可以说, WebService ,为分布 式应用的开发,提供了一个很好的平台。

//2.对 WebService 的调用,是通过SOAP协议进行的。
// 简单对象访问协议(SOAP)提供了标准的远程过程调用(RPC)方法来调用Web service。
// 而SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式,因此,对 WebService 的调用也可以是跨平台的。
}


//#include "CGlobalFunc.h"
void CLocalProcessDlg::OnBnClickedButton10()
{
// 通过ole技术,com组件思想,实现ActiveX控件,具体参考ActiveX控件使用实例
// 先用atl做一个com组件,引入头文件,然后就可以远程调用com组件中的方法了
// 下面是调用远程方法的代码
/*try
{
IGlobalFunc *pAccount = NULL;

IUnknown *pUnknown;
HRESULT hr;
CoInitialize(NULL);//初始化COM环境

hr = CoInitializeSecurity(
NULL, //Points to security descriptor
-1, //Count of entries in asAuthSvc
NULL, //Array of names to register
NULL, //Reserved for future use
RPC_C_AUTHN_LEVEL_DEFAULT, //The default authentication level for proxies
RPC_C_IMP_LEVEL_IDENTIFY, //The default impersonation level for proxies
NULL, //Reserved; must be set to NULL
0, //Additional client or server-side capabilities
NULL //Reserved for future use
);

COAUTHINFO sAuthInfo;
sAuthInfo.dwAuthnSvc = RPC_C_AUTHN_DEFAULT;
sAuthInfo.dwAuthnLevel = RPC_C_AUTHN_LEVEL_DEFAULT;
//sAuthInfo.dwAuthzSvc = RPC_C_AUTHZ_DEFAULT;
sAuthInfo.dwAuthzSvc = RPC_C_AUTHZ_NONE;
// sAuthInfo.dwCapabilities = EOAC_NONE;//must be
sAuthInfo.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;//must be
sAuthInfo.pwszServerPrincName = NULL;
sAuthInfo.pAuthIdentityData = (COAUTHIDENTITY*)malloc(sizeof(COAUTHIDENTITY));
sAuthInfo.pAuthIdentityData->User = (USHORT *)L"Administrator" ;//访问远程对象所在主机的用户名,宽字符串
sAuthInfo.pAuthIdentityData->UserLength =sizeof("Administrator"); //用户名的字符长度
sAuthInfo.pAuthIdentityData->Password = (USHORT *)L"123456" ;//密码,宽字符串
sAuthInfo.pAuthIdentityData->PasswordLength = 6; //密码长度
sAuthInfo.pAuthIdentityData->Domain = NULL; //远程主机的域,如果没有域则设置为NULL
sAuthInfo.pAuthIdentityData->DomainLength = 0;//域名长度
sAuthInfo.pAuthIdentityData->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;

COSERVERINFO serverInfo;
memset(&serverInfo, 0, sizeof(COSERVERINFO));
serverInfo.pwszName = L"192.168.1.37"; //远程主机的名称
serverInfo.pAuthInfo = &sAuthInfo;
MULTI_QI qi;
memset(&qi, 0, sizeof(MULTI_QI));
qi.pIID = &IID_IUnknown;

CLSID CLSID_InsideCOM ={0x5E81CE1B,0x7A39,0x4420,{0x80,0xF7,0x72,0x80,0xDA,0x74,0x38,0x67}};
const IID IID_IAccount={0x1E57C7D0,0x25E3,0x42EE,{0xB5,0xD1,0xFC,0xCF,0x8E,0xA6,0x70,0x2B}};

hr=CoCreateInstanceEx(CLSID_InsideCOM,NULL,CLSCTX_REMOTE_SERVER,&serverInfo,1,&qi);
pUnknown = (IUnknown *) qi.pItf;//对接口设置代理权限
hr=CoSetProxyBlanket(pUnknown , sAuthInfo.dwAuthnSvc, sAuthInfo.dwAuthzSvc, sAuthInfo.pwszServerPrincName,
sAuthInfo.dwAuthnLevel, sAuthInfo.dwImpersonationLevel, sAuthInfo.pAuthIdentityData, sAuthInfo.dwCapabilities);

hr = pUnknown->QueryInterface(IID_IAccount,(void**)&pAccount);
//hr=CoSetProxyBlanket((IUnknown *)pAccount,sAuthInfo.dwAuthnSvc, sAuthInfo.dwAuthzSvc, sAuthInfo.pwszServerPrincName,
//sAuthInfo.dwAuthnLevel, sAuthInfo.dwImpersonationLevel, sAuthInfo.pAuthIdentityData, sAuthInfo.dwCapabilities);
//pAccount->GetADORecordset();
BSTR bstrRet = pAccount->Time2Str(_bstr_t(L"2013-09-16 00:01:02"));
AfxMessageBox(COLE2T(bstrRet));
pUnknown->Release();
}
catch (_com_error e)
{
AfxMessageBox(e.Description());
}*/
}

void CLocalProcessDlg::OnBnClickedButton11()
{
// windows 有rpc的自持库 rpcrt4.lib,Linux下也可以自己实现
}

void CLocalProcessDlg::OnBnClickedButton9()
{
// 动态数据交换技术,貌似现在用的比较少
}

void CLocalProcessDlg::OnBnClickedButton15()
{
// 通过共享一个中间数据库,实现不同进程读写通信
}

void CLocalProcessDlg::OnBnClickedButton14()
{
// 通过对中间文件的访问,如XML文件,txt文件,设置读写标志位
}


接收进程:

// TestProcessDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "TestProcess.h"
#include "TestProcessDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

const UINT wm_nMemMsg=RegisterWindowMessage("mem_data");

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// 对话框数据
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CTestProcessDlg 对话框




CTestProcessDlg::CTestProcessDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestProcessDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTestProcessDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CTestProcessDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_WM_COPYDATA()
ON_REGISTERED_MESSAGE(wm_nMemMsg,OnRegMemMsg)
ON_BN_CLICKED(IDC_BTN_READ, &CTestProcessDlg::OnBnClickedBtnRead)
ON_BN_CLICKED(IDC_BUTTON1, &CTestProcessDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CTestProcessDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CTestProcessDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CTestProcessDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON5, &CTestProcessDlg::OnBnClickedButton5)
END_MESSAGE_MAP()


// CTestProcessDlg 消息处理程序

BOOL CTestProcessDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

void CTestProcessDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。

void CTestProcessDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CTestProcessDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}


BOOL CTestProcessDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));/*利用对话框表示收到消息*/

return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}

void CTestProcessDlg::OnBnClickedBtnRead()
{
// TODO: 在此添加控件通知处理程序代码
HANDLE hMapFile = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,_T("TestFileMap"));
if (hMapFile)
{
//显示共享的文件数据。
LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);
AfxMessageBox(lpMapAddr);
}
}

#define BUFFER_SIZE 1024
char data[BUFFER_SIZE]; //不能为局部,否则发送到调用后释放会出现空指针
LRESULT CTestProcessDlg::OnRegMemMsg(WPARAM wParam,LPARAM lParam)
{
//TODO: 在此添加控件通知处理程序代码
LPVOID lpBaseAddress=(LPVOID)lParam;

HANDLE hProcess=GetCurrentProcess(); //把字符串写入hProcess进程的内存

SIZE_T cbNumOfBytes;
ReadProcessMemory(hProcess, lpBaseAddress, data, BUFFER_SIZE, &cbNumOfBytes);
data[cbNumOfBytes]='\0';
AfxMessageBox(data);

return 0;

}
void CTestProcessDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
if(!WaitNamedPipe(_T("\\\\.\\pipe\\MyPipe"),NMPWAIT_WAIT_FOREVER))
{
AfxMessageBox(_T("当前没有可利用的命名管道实例!"));
return;
}

// 打开已存在管道
HANDLE hPipe=CreateFile(_T("\\\\.\\pipe\\MyPipe"),GENERIC_READ | GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if(INVALID_HANDLE_VALUE==hPipe)
{
AfxMessageBox(_T("打开命名管道失败!"));
hPipe=NULL;
return;
}

char buf[100];

DWORD dwRead;
if(!ReadFile(hPipe,buf,100,&dwRead,NULL))
{
AfxMessageBox(_T("读取数据失败!"));
return;
}
buf[dwRead] = '\0';
AfxMessageBox(buf);
}

void CTestProcessDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
if(OpenClipboard())
{
if(IsClipboardFormatAvailable(CF_TEXT))
{
HANDLE hClip;
char *pBuf;
hClip=GetClipboardData(CF_TEXT);
pBuf=(char*)GlobalLock(hClip);
GlobalUnlock(hClip);
AfxMessageBox(pBuf);
CloseClipboard();
}
}
else
{
AfxMessageBox(_T("打开剪切板失败!"));
}
}

#include "../ShareDLL/ShareDLL.h"
#pragma comment(lib, "../Debug/ShareDLL.lib")
void CTestProcessDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
/*HMODULE hLib=LoadLibrary("..\\Debug\\Win32dll.dll");
if(NULL==hLib)
{
AfxMessageBox("LoadLibrary failed\n");
return ;
}*/

char buff[1024];
GetData(buff);
AfxMessageBox(buff);
}

void CTestProcessDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
HANDLE hRead=::GetStdHandle(STD_INPUT_HANDLE) ;
char buf[100] ="";
DWORD len ;
::ReadFile(hRead,buf,100,&len,NULL) ;
buf[len]='\0';
AfxMessageBox(buf);
}

void CTestProcessDlg::OnBnClickedButton5()
{
// 邮件槽只支持单向数据传输,也就是服务器只能接收数据,而客户端只能发送数据,
// 服务端就是创建邮槽的那一端,而客户端就是已存在的邮件槽的那一端。
HANDLE Mailslot;
char Buffer[256];
DWORD NumberOfBytesRead;

CString strMsg;
if ((Mailslot = CreateMailslotA("\\\\.\\Mailslot\\Myslot",0,MAILSLOT_WAIT_FOREVER,NULL)) == INVALID_HANDLE_VALUE)
{
strMsg.Format("Failed to Create a mailslot %d\n",GetLastError());
AfxMessageBox(strMsg);
return ;
}

if (ReadFile(Mailslot,Buffer,256,&NumberOfBytesRead,NULL) != 0)
{
strMsg.Format("%.*s\n",NumberOfBytesRead,Buffer);
AfxMessageBox(strMsg);
}
Buffer[NumberOfBytesRead]='\0';
AfxMessageBox(Buffer);
}