发送进程

接收进程

发送进程:

// 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_MAPON_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,//默认安全结构属性 NULLNULL,//同上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;  //远程主机的域,如果没有域则设置为NULLsAuthInfo.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
#endifconst 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_MAPON_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);
}

VC++ 进程间通信方法总结相关推荐

  1. VC/MFC 进程间通信方法总结

    VC/MFC 进程间通信方法总结 摘   要   随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程 / 多线程程序成为现代程序设计的一个重要特点,在多进程程序设计 ...

  2. VC++调试方法和技巧

    VC++调试方法和技巧 便于调试的代码风格: 1.       不用全局变量: 2.       所有变量都要初始化,成员变量在构造函数中初始化: 3.       尽量使用const: 4.     ...

  3. YDOOK: Python3 IPC 进程间通信方法分类总结

    YDOOK: Python3 IPC 进程间通信方法分类总结 © YDOOK JY Lin 1.管道:pipeline 2.消息队列:msg queue 3.共享内存:share memory 4.信 ...

  4. linux vc 调试方法,VC实现【API钩取】【调试法】附加调试器

    最近在学习逆向核心,在论坛也发了几篇帖子说说自己的经验,帮助自己巩固知识,也方便了大家. 如果帖子中有什么疏漏甚至不对的地方,请大牛们指出,我会积极改正的! 废话不多说,还是我[Miss丿小沫],上教 ...

  5. iOS内IPC(进程间通信)方法小结

    转自:http://blog.csdn.net/lifengzhong/article/details/7739539 受限与iOS系统的运行机制,绝大多数情况下一个应用在进入后台后会马上进入susp ...

  6. 可以让你玩儿光剑的程序,vc实现方法和代码

    http://blog.csdn.net/onezeros/article/details/6124073 前几天写了一个可以玩儿光剑的程序,个人觉得很酷 这个程序你完全可以在自己电脑上玩玩,很有星球 ...

  7. vc+ mfc 方法怎么被调用_Spring源码阅读(二)我的方法是怎么被自动调用的

    曾几何时,我们在写Java代码时,写好一个类,然后去创建这个类的对象,再调用它的方法,项目可能变得有些冗余,但却其乐融融,因为我知道程序每一步干了什么, 但现在,时代变了,你发现我往往只需要实现一个接 ...

  8. Python实现多进程间通信的方法总结

    0 引言 众所周知,python因为GIL的存在,其多线程只能在一个CPU中调度,对于计算密集型任务完全不能充分利用多核资源,所以需要Python多进程编程.多进程程序最大的性能瓶颈往往出在进程间通信 ...

  9. Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用)

    Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用) 概述 传统的多进程间通信往往非常麻烦,采用的方法比如管道,共享内存,socket,文件等,大都非常繁琐, 1 ...

最新文章

  1. 【编译打包】twemproxy-0.4.0-2.el7.centos.src.rpm
  2. Swift - 可编辑表格样例(可直接编辑单元格中内容、移动删除单元格)
  3. 过去3个多月的1200个小时里,我收获了什么?| 2021年年中总结
  4. MySQL 查询速度慢与性能差的原因与解决方法
  5. java referencequeue_java源代码 Reference和ReferenceQueue分析
  6. 我的docker随笔20:多平台docker镜像下载
  7. 发现VB6中SAX的乐趣[转]
  8. LeetCode 面试题 08.01. 三步问题 (动态规划)
  9. 【三维激光扫描】第四章:点云数据处理
  10. mysqldump --set-gtid-purged=OFF
  11. FH153C6常用一键开关机芯片 ON/OFF单键开关IC 美容仪电子开关IC
  12. window.open 卡死
  13. 程序员也要学英语——印欧语音变规律总结
  14. TypeError: can‘t unbox heterogeneous list: int64 = float64
  15. 最新Discuz手机模板NVBING5手机版源码+可封装APP
  16. DLL注入_远程线程注入
  17. js实现web汉字笔画教学
  18. proteus仿真——四路抢答器
  19. java五子棋_java实现五子棋
  20. html设置单元格间距属性,css单元格间距怎么调?

热门文章

  1. 修改html时webpack热更新,利用webpack实现对html文件的热更新
  2. python 定义变量x格式_如何从CSV文件中提取数据列并将它们定义为x和y变量,然后使用pylab在python中绘制它们?...
  3. Period_JAVA
  4. HAAR、LBP分类器训练
  5. 【自动驾驶】23.相机成像究竟是成在像平面还是成在焦平面
  6. 今天开始学Pattern Recognition and Machine Learning (PRML),章节5.2-5.3,Neural Networks神经网络训练(BP算法)
  7. 数据结构与算法(1)——数组与链表
  8. Mybatis的ResultMap的使用
  9. HTML特殊转义字符对照表
  10. Java并发编程(4):守护线程与线程阻塞的四种情况