您的位置:首页 > 其它

进程间通信交换数据——初级篇

2010-07-09 17:01 141 查看
[b]1:采用自定义信息[/b]

发端:

(1)UpdateData();

(2)查找对象句柄 CWnd *pWnd = CWnd::FindWindow(NULL,_T("DataRecv1"));

(3)自定义消息WM_Comm1:#define WM_COMM1 WM_USER+101,

(4) 发送
UINT uMsg;
uMsg = atoi(m_StrMes);
pWnd->SendMessage(WM_COMM1,NULL,(LPARAM)uMsg);

收端:

(1)定义相同的消息#define WM_COMM1 WM_USER+101

(2)ON_MESSAGE(WM_COMM1,OnUserReceiveMsg)

(3)afx_msg void OnUserReceiveMsg(WPARAM wParam,LPARAM lParam);

(4)void CDataRecv1Dlg::OnUserReceiveMsg(WPARAM wParam,LPARAM lParam)
{
m_StrGetMes.Format("%d\n",int(lParam));
UpdateData(FALSE);
}

[b]2:用注册消息进行通信[/b]

和自定义消息很类似

发端:

(1):注册消息const UINT wm_nRegMsg=RegisterWindowMessage("reg_data");

(2)同自定义消息

收端

(1):注册消息const UINT wm_nRegMsg=RegisterWindowMessage("reg_data");

(2):ON_REGISTERED_MESSAGE(wm_nRegMsg,OnRegReceiveMsg)//(注意采用的宏不一样)

(3),(4)同:

[b]3: 用wm_copydata消息实现通信[/b]

发端:

(1):查找对象窗口的句柄

(2):发送copydatastruct结构体

COPYDATASTRUCT cpd;
cpd.dwData =0;
cpd.cbData = m_CopyData.GetLength();
cpd.lpData = (void*)m_CopyData.GetBuffer(cpd.cbData);
pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);

收端:

(1)在message_map中添加ON_WM_COPYDATA()

(2)afx_msg中添加afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);

(3)消息映射

BOOL CDataRecv1Dlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
m_StrGetCopyData= (LPCTSTR)pCopyDataStruct->lpData;
m_StrGetCopyData=m_StrGetCopyData.Left(pCopyDataStruct->cbData);
UpdateData(FALSE);
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}

[b]4:使用内存地址通信[/b]

发端:

(1)查找对象句柄

(2):获得当前句柄的进程ID:

DWORD PID;
GetWindowThreadProcessId(pWnd->m_hWnd,(DWORD*)&PID);

(3):根据进程ID打开进程获得进程句柄

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

(4):分配虚拟内存

LPVOID lpBaseAddress;
lpBaseAddress = VirtualAllocEx(hProcess,0,BUFFER_SIZE,MEM_COMMIT,PAGE_READWRITE);
char data[BUFFER_SIZE];
strcpy(data,m_strSendAddress);

(5):将数据写入对象进程地址空间中

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

(6):注册消息

const UINT wm_nMemMsg=RegisterWindowMessage("mem_data");

(7):发送注册消息

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

(8)释放申请的虚拟内存

VirtualFreeEx(hProcess,lpBaseAddress,0,MEM_RELEASE);

收端:

(1):const UINT wm_nMemMsg=RegisterWindowMessage("mem_data");

(2):ON_REGISTERED_MESSAGE(wm_nMemMsg,OnRegMemMsg)

(3):afx_msg void OnRegMemMsg(WPARAM wParam,LPARAM lParam);

(4):

void CDataRecv1Dlg::OnRegMemMsg(WPARAM wParam,LPARAM lParam)
{
LPVOID lpBaseAddress=(LPVOID)lParam;

//打开进程
HANDLE hProcess = GetCurrentProcess();

char data[BUFFER_SIZE];

//通过当前进程读内存中的数据
ReadProcessMemory(hProcess,lpBaseAddress,data,BUFFER_SIZE,NULL);
m_GetMemData = data;
UpdateData(FALSE);

}

[b]5:利用内存映射通信[/b]

发端:

(1):// 创建内存映像对象.

HANDLE hMapping;
LPSTR lpData;
hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,
PAGE_READWRITE,0,BUFFER_SIZE,"MYSHARE");


(2):将文件的视图映射到一个进程的地址空间上,返回LPVOID类型的内存指针.

lpData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);

(3:给这段映像内存写数据

sprintf(lpData,m_strFileMap);

(4)// 释放映像内存.
UnmapViewOfFile(lpData);


收端:

和发端比较类似

hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,
NULL,PAGE_READWRITE,0,0x100,"MYSHARE");
if(hMapping==NULL)
{
AfxMessageBox("CreateFileMapping() failed.");
return;
}
lpData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
if(lpData==NULL)
{
AfxMessageBox("MapViewOfFile() failed.");
return;
}


//给这段映像内存的数据赋给本地变量
m_strFileMap.Format("%s",lpData);
UnmapViewOfFile(lpData);


6:使用剪贴板数据通信

发端:

UpdateData(); // 更新数据.
CString strData=m_strClipBoard; // 获得数据.

// 打开系统剪贴板.
if (!OpenClipboard()) return;

// 使用之前,清空系统剪贴板.
EmptyClipboard();

// 分配一内存,大小等于要拷贝的字符串的大小,返回的内存控制句柄.
HGLOBAL hClipboardData;
hClipboardData = GlobalAlloc(GMEM_DDESHARE, strData.GetLength()+1);

// 内存控制句柄加锁,返回值为指向那内存控制句柄所在的特定数据格式的指针.
char * pchData;
pchData = (char*)GlobalLock(hClipboardData);
// 将本地变量的值赋给全局内存.
strcpy(pchData, LPCSTR(strData));
// 给加锁的全局内存控制句柄解锁.
GlobalUnlock(hClipboardData);
// 通过全局内存句柄将要拷贝的数据放到剪贴板上.
SetClipboardData(CF_TEXT,hClipboardData);
// 使用完后关闭剪贴板.
CloseClipboard();

收端:

// 打开系统剪贴板.
if (!OpenClipboard()) return;

// 判断剪贴板上的数据是否是指定的数据格式.
if (IsClipboardFormatAvailable(CF_TEXT)|| IsClipboardFormatAvailable(CF_OEMTEXT))
{// 从剪贴板上获得数据.
HANDLE hClipboardData = GetClipboardData(CF_TEXT);
// 通过给内存句柄加锁,获得指向指定格式数据的指针.
char *pchData = (char*)GlobalLock(hClipboardData);
// 本地变量获得数据.
m_strClipBoard = pchData;
// 给内存句柄解锁.
GlobalUnlock(hClipboardData);
}
else
{ AfxMessageBox("There is no text (ANSI) data on the Clipboard.");
}
// 使用完后关闭剪贴板.
CloseClipboard();

// 更新数据.
UpdateData(FALSE);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: