VC++ 进程间通信方法总结
生活随笔
收集整理的這篇文章主要介紹了
VC++ 进程间通信方法总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
發送進程
接收進程
發送進程:
// 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); }
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的VC++ 进程间通信方法总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 临界区、事件、互斥量、 信号量--四种控
- 下一篇: 交换两个数组的元素使之总和的差值最小