日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC++ 进程间通信方法总结

發(fā)布時(shí)間:2025/3/21 c/c++ 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC++ 进程间通信方法总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

發(fā)送進(jìn)程


接收進(jìn)程


發(fā)送進(jìn)程:

// LocalProcessDlg.cpp : 實(shí)現(xiàn)文件 //#include "stdafx.h" #include "LocalProcess.h" #include "LocalProcessDlg.h"#ifdef _DEBUG #define new DEBUG_NEW #endif// 用于應(yīng)用程序“關(guān)于”菜單項(xiàng)的 CAboutDlg 對(duì)話框class CAboutDlg : public CDialog { public:CAboutDlg();// 對(duì)話框數(shù)據(jù)enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 實(shí)現(xiàn) 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 對(duì)話框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();// 將“關(guān)于...”菜單項(xiàng)添加到系統(tǒng)菜單中。// IDM_ABOUTBOX 必須在系統(tǒng)命令范圍內(nèi)。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);}}// 設(shè)置此對(duì)話框的圖標(biāo)。當(dāng)應(yīng)用程序主窗口不是對(duì)話框時(shí),框架將自動(dòng)// 執(zhí)行此操作SetIcon(m_hIcon, TRUE); // 設(shè)置大圖標(biāo)SetIcon(m_hIcon, FALSE); // 設(shè)置小圖標(biāo)// TODO: 在此添加額外的初始化代碼return TRUE; // 除非將焦點(diǎn)設(shè)置到控件,否則返回 TRUE }void CLocalProcessDlg::OnSysCommand(UINT nID, LPARAM lParam) {if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);} }// 如果向?qū)υ捒蛱砑幼钚』粹o,則需要下面的代碼 // 來繪制該圖標(biāo)。對(duì)于使用文檔/視圖模型的 MFC 應(yīng)用程序, // 這將由框架自動(dòng)完成。void CLocalProcessDlg::OnPaint() {if (IsIconic()){CPaintDC dc(this); // 用于繪制的設(shè)備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使圖標(biāo)在工作區(qū)矩形中居中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;// 繪制圖標(biāo)dc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();} }//當(dāng)用戶拖動(dòng)最小化窗口時(shí)系統(tǒng)調(diào)用此函數(shù)取得光標(biāo) //顯示。 HCURSOR CLocalProcessDlg::OnQueryDragIcon() {return static_cast<HCURSOR>(m_hIcon); }void CLocalProcessDlg::OnBnClickedBtnSend() {// TODO: 在此添加控件通知處理程序代碼HWND hWnd=::FindWindow(NULL,"TestProcess");if(hWnd!=NULL) { COPYDATASTRUCT cpd; /*給COPYDATASTRUCT結(jié)構(gòu)賦值*/ cpd.dwData = 0; cpd.cbData = strlen("hello copy_data")+1; cpd.lpData = (void*)"hello copy_data"; ::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd);//發(fā)送! } }//$文件映射-常用方式 void CLocalProcessDlg::FileMapping(void) {//打開共享的文件對(duì)象。m_hMapFile = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,_T("TestFileMap"));if (m_hMapFile){//顯示共享的文件數(shù)據(jù)。LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);OutputDebugString(lpMapAddr);}else{//創(chuàng)建共享文件。m_hMapFile = ::CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 1024, "TestFileMap");//拷貝數(shù)據(jù)到共享文件里。LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(m_hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);StrCpy(lpMapAddr,"hello file map");FlushViewOfFile(lpMapAddr,sizeof "hello file map");} }//$共享內(nèi)存-文件映射使用該方式實(shí)現(xiàn) #define BUFFER_SIZE 1024 const UINT wm_nMemMsg=RegisterWindowMessage("mem_data"); void CLocalProcessDlg::OnBnClickedButton8() {// TODO: 在此添加控件通知處理程序代碼CWnd *pWnd=CWnd::FindWindow(NULL, _T("TestProcess")); //查找Recieve進(jìn)程if(pWnd==NULL){AfxMessageBox(_T("尋找接收消息窗口失敗!"));return;}DWORD dwProcessID; //獲取進(jìn)程號(hào)GetWindowThreadProcessId(pWnd->m_hWnd, (DWORD*)&dwProcessID);//HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS,FALSE,PID);//為保證OpenProcess函數(shù)調(diào)用成功,用戶所影響的進(jìn)程必須由上述標(biāo)志創(chuàng)建。HANDLE hProcess=OpenProcess(STANDARD_RIGHTS_REQUIRED|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_VM_OPERATION,//訪問權(quán)限FALSE,//繼承關(guān)系dwProcessID);//進(jìn)程ID //分配虛擬內(nèi)存LPVOID lpBaseAddress = VirtualAllocEx(hProcess, 0, BUFFER_SIZE,MEM_COMMIT, PAGE_READWRITE);char data[BUFFER_SIZE];strcpy(data,"hello memshare");//把字符串寫入hProcess進(jìn)程的內(nèi)存WriteProcessMemory(hProcess, lpBaseAddress, data, BUFFER_SIZE, NULL);//發(fā)送基址給Recieve進(jìn)程pWnd->SendMessage(wm_nMemMsg, NULL,(LPARAM)lpBaseAddress);Sleep(500); //等待接收程序接收數(shù)據(jù)VirtualFreeEx(hProcess,lpBaseAddress, 0, MEM_RELEASE); //釋放虛擬內(nèi)存 }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("創(chuàng)建命名管道失敗!");hPipe=NULL;return;}HANDLE hEvent;hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);if(!hEvent){AfxMessageBox("創(chuàng)建事件對(duì)象失敗!");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("等待對(duì)象失敗!");CloseHandle(hPipe);CloseHandle(hEvent);hPipe=NULL;return;}char * buf = "hello mypipe";DWORD dwWrite;if(!WriteFile(hPipe,buf,strlen(buf)+1,&dwWrite,NULL)){AfxMessageBox("寫入數(shù)據(jù)失敗!");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); //將句柄轉(zhuǎn)換為指針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結(jié)構(gòu)體指針 一定不能為NULL否則子進(jìn)程不能繼承返回的句柄0//管道的buffer大小 0表示默認(rèn)大小) ; PROCESS_INFORMATION pp={0};//接收進(jìn)程信息STARTUPINFO si ={0}; //表示子進(jìn)程如何顯示si.cb=sizeof(STARTUPINFO) ;//大小//$設(shè)置STARTF_USESHOWWINDOW將無法通信成功si.dwFlags=/*STARTF_USESHOWWINDOW*/ STARTF_USESTDHANDLES ;//指定那些可用si.hStdInput=hRead ;//設(shè)置標(biāo)準(zhǔn)輸入句柄 為管道讀取句柄si.hStdOutput=hWrite ;//設(shè)置標(biāo)準(zhǔn)輸出句柄為管道寫句柄si.hStdError=::GetStdHandle(STD_ERROR_HANDLE) ;//調(diào)用函數(shù)獲得標(biāo)準(zhǔn)錯(cuò)誤句柄CreateProcess("RecvProcess.exe",//可執(zhí)行模塊的完整路徑NULL ,//命令行參數(shù)NULL,//默認(rèn)安全結(jié)構(gòu)屬性 NULLNULL,//同上TRUE,//子進(jìn)程是否從Calling他的進(jìn)程繼承句柄0,//表示啟動(dòng)進(jìn)程時(shí)的附加標(biāo)記 這里我們只是創(chuàng)建一個(gè)進(jìn)程設(shè)置為 0即可NULL,//表示新進(jìn)程使用的內(nèi)存塊 NULL表示子進(jìn)程使用父進(jìn)程的內(nèi)存塊 NULL,//表示啟動(dòng)時(shí)子進(jìn)程的路徑名 如果為NULL表示子進(jìn)程和父進(jìn)程使用相同的路徑名&si ,//表示子進(jìn)程如何顯示 還有為標(biāo)準(zhǔn)輸入輸出 標(biāo)準(zhǔn)錯(cuò)誤句柄賦值為管道句柄&pp) ;//LPPROCESS_INFORMATION 結(jié)構(gòu)體用來接收創(chuàng)建的子進(jìn)程的信息char *buf = "hello nomanepipe";DWORD dwWrite;if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL)){AfxMessageBox("寫入數(shù)據(jù)失敗!");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++有對(duì)soap協(xié)議的封裝,gsoap網(wǎng)上資料很多,實(shí)例也很多,由于實(shí)現(xiàn)較麻煩,這里不再復(fù)述//1.由于 WebService 經(jīng)由web服務(wù)器發(fā)布,所以比DCOM而言,可以順利穿過防火墻。// 這也是 WebService 的優(yōu)點(diǎn)之一,可以說, WebService ,為分布 式應(yīng)用的開發(fā),提供了一個(gè)很好的平臺(tái)。//2.對(duì) WebService 的調(diào)用,是通過SOAP協(xié)議進(jìn)行的。// 簡(jiǎn)單對(duì)象訪問協(xié)議(SOAP)提供了標(biāo)準(zhǔn)的遠(yuǎn)程過程調(diào)用(RPC)方法來調(diào)用Web service。 // 而SOAP也是基于XML和XSD的,XML是SOAP的數(shù)據(jù)編碼方式,因此,對(duì) WebService 的調(diào)用也可以是跨平臺(tái)的。 }//#include "CGlobalFunc.h" void CLocalProcessDlg::OnBnClickedButton10() {// 通過ole技術(shù),com組件思想,實(shí)現(xiàn)ActiveX控件,具體參考ActiveX控件使用實(shí)例// 先用atl做一個(gè)com組件,引入頭文件,然后就可以遠(yuǎn)程調(diào)用com組件中的方法了// 下面是調(diào)用遠(yuǎn)程方法的代碼/*try{IGlobalFunc *pAccount = NULL;IUnknown *pUnknown;HRESULT hr;CoInitialize(NULL);//初始化COM環(huán)境 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" ;//訪問遠(yuǎn)程對(duì)象所在主機(jī)的用戶名,寬字符串sAuthInfo.pAuthIdentityData->UserLength =sizeof("Administrator"); //用戶名的字符長(zhǎng)度sAuthInfo.pAuthIdentityData->Password = (USHORT *)L"123456" ;//密碼,寬字符串sAuthInfo.pAuthIdentityData->PasswordLength = 6; //密碼長(zhǎng)度sAuthInfo.pAuthIdentityData->Domain = NULL; //遠(yuǎn)程主機(jī)的域,如果沒有域則設(shè)置為NULLsAuthInfo.pAuthIdentityData->DomainLength = 0;//域名長(zhǎng)度sAuthInfo.pAuthIdentityData->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; COSERVERINFO serverInfo;memset(&serverInfo, 0, sizeof(COSERVERINFO));serverInfo.pwszName = L"192.168.1.37"; //遠(yuǎn)程主機(jī)的名稱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;//對(duì)接口設(shè)置代理權(quán)限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下也可以自己實(shí)現(xiàn) }void CLocalProcessDlg::OnBnClickedButton9() {// 動(dòng)態(tài)數(shù)據(jù)交換技術(shù),貌似現(xiàn)在用的比較少 }void CLocalProcessDlg::OnBnClickedButton15() {// 通過共享一個(gè)中間數(shù)據(jù)庫,實(shí)現(xiàn)不同進(jìn)程讀寫通信 }void CLocalProcessDlg::OnBnClickedButton14() {// 通過對(duì)中間文件的訪問,如XML文件,txt文件,設(shè)置讀寫標(biāo)志位 }
接收進(jìn)程:

// TestProcessDlg.cpp : 實(shí)現(xiàn)文件 //#include "stdafx.h" #include "TestProcess.h" #include "TestProcessDlg.h"#ifdef _DEBUG #define new DEBUG_NEW #endifconst UINT wm_nMemMsg=RegisterWindowMessage("mem_data");// 用于應(yīng)用程序“關(guān)于”菜單項(xiàng)的 CAboutDlg 對(duì)話框class CAboutDlg : public CDialog { public:CAboutDlg();// 對(duì)話框數(shù)據(jù)enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 實(shí)現(xiàn) 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 對(duì)話框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();// 將“關(guān)于...”菜單項(xiàng)添加到系統(tǒng)菜單中。// IDM_ABOUTBOX 必須在系統(tǒng)命令范圍內(nèi)。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);}}// 設(shè)置此對(duì)話框的圖標(biāo)。當(dāng)應(yīng)用程序主窗口不是對(duì)話框時(shí),框架將自動(dòng)// 執(zhí)行此操作SetIcon(m_hIcon, TRUE); // 設(shè)置大圖標(biāo)SetIcon(m_hIcon, FALSE); // 設(shè)置小圖標(biāo)// TODO: 在此添加額外的初始化代碼return TRUE; // 除非將焦點(diǎn)設(shè)置到控件,否則返回 TRUE }void CTestProcessDlg::OnSysCommand(UINT nID, LPARAM lParam) {if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);} }// 如果向?qū)υ捒蛱砑幼钚』粹o,則需要下面的代碼 // 來繪制該圖標(biāo)。對(duì)于使用文檔/視圖模型的 MFC 應(yīng)用程序, // 這將由框架自動(dòng)完成。void CTestProcessDlg::OnPaint() {if (IsIconic()){CPaintDC dc(this); // 用于繪制的設(shè)備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使圖標(biāo)在工作區(qū)矩形中居中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;// 繪制圖標(biāo)dc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();} }//當(dāng)用戶拖動(dòng)最小化窗口時(shí)系統(tǒng)調(diào)用此函數(shù)取得光標(biāo) //顯示。 HCURSOR CTestProcessDlg::OnQueryDragIcon() {return static_cast<HCURSOR>(m_hIcon); }BOOL CTestProcessDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) {// TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值A(chǔ)fxMessageBox((LPCSTR)(pCopyDataStruct->lpData));/*利用對(duì)話框表示收到消息*/ return CDialog::OnCopyData(pWnd, pCopyDataStruct); }void CTestProcessDlg::OnBnClickedBtnRead() {// TODO: 在此添加控件通知處理程序代碼HANDLE hMapFile = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE,_T("TestFileMap"));if (hMapFile){//顯示共享的文件數(shù)據(jù)。LPTSTR lpMapAddr = (LPTSTR)MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);AfxMessageBox(lpMapAddr);} }#define BUFFER_SIZE 1024 char data[BUFFER_SIZE]; //不能為局部,否則發(fā)送到調(diào)用后釋放會(huì)出現(xiàn)空指針 LRESULT CTestProcessDlg::OnRegMemMsg(WPARAM wParam,LPARAM lParam) {//TODO: 在此添加控件通知處理程序代碼LPVOID lpBaseAddress=(LPVOID)lParam;HANDLE hProcess=GetCurrentProcess(); //把字符串寫入hProcess進(jìn)程的內(nèi)存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("當(dāng)前沒有可利用的命名管道實(shí)例!"));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("讀取數(shù)據(jù)失敗!"));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() {// 郵件槽只支持單向數(shù)據(jù)傳輸,也就是服務(wù)器只能接收數(shù)據(jù),而客戶端只能發(fā)送數(shù)據(jù),// 服務(wù)端就是創(chuàng)建郵槽的那一端,而客戶端就是已存在的郵件槽的那一端。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); }

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的VC++ 进程间通信方法总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。