C++プロセス間通信
1635 ワード
プロセスが開始されるとオペレーティングシステムはこのプロセスに4 GBのプライベートアドレス空間を割り当ててこのプロセスに使用する.1つのプロセスにおける複数のスレッドは、同じアドレス空間を共有する.したがって、スレッド間の通信は非常に簡単である.各プロセスが持つ4 GBのメモリ空間はすべて私有であるためである.あるプロセスは別のプロセスアドレスのデータにアクセスできない.そのため、プロセス間の通信は相対的に困難である.Windowsプラットフォームの下で.システムは私たちに多種のプロセス間の通信のメカニズムを提供した.
プロセス間通信の4つの方法:
1.せん断板
クリップボードは、実際にはシステムメンテナンス管理のメモリ領域である.あるプロセスでデータをコピーすると、実際にはこのメモリにデータを入れます.
別のプロセスでは、データを貼り付けるときにこのメモリ領域からデータを取り出す.ウィンドウに表示する.
エリアの内容
2.匿名パイプ
3.名前付きパイプ
4.郵便ポスト
プロセス間通信の4つの方法:
1.せん断板
クリップボードは、実際にはシステムメンテナンス管理のメモリ領域である.あるプロセスでデータをコピーすると、実際にはこのメモリにデータを入れます.
別のプロセスでは、データを貼り付けるときにこのメモリ領域からデータを取り出す.ウィンドウに表示する.
void CClipboardDlg::OnBnClickedBtnSend()
{
// . 0, 0 .
if(OpenClipboard()){
CString str;
TCHAR *pBuf;
HANDLE hClip;
EmptyClipboard(); // , .
GetDlgItemText(IDC_EDIT_SEND, str);
// . 1: , 2: .
// :GMEM_MOVEABLE , GMEM_FIXED .
hClip = GlobalAlloc(GMEM_MOVEABLE, str.GetLength() * 2 + 2);
// , .
pBuf = (TCHAR *)GlobalLock(hClip);
_tcscpy(pBuf, str); //
GlobalUnlock(hClip); // .
// :1. , 2. .
//CF_UNICODETEXT:UNICODE .
SetClipboardData(CF_UNICODETEXT, hClip);
// .
CloseClipboard();
}
}
void CClipboardDlg::OnBnClickedBtnRecv()
{
// . 0, 0 .
if(OpenClipboard()){
// . : , .
if(IsClipboardFormatAvailable(CF_UNICODETEXT)){
// .
HANDLE hClip;
// BUF.
TCHAR *pBuf;
// .
hClip = GetClipboardData(CF_UNICODETEXT);
// , .
pBuf = (TCHAR *)GlobalLock(hClip);
SetDlgItemText(IDC_EDIT_RECV, pBuf);
// . .
CloseClipboard();
}
}
}
エリアの内容
2.匿名パイプ
3.名前付きパイプ
4.郵便ポスト