進程間通信

1.剪切板

//保存到剪切板

if(OpenClipboard())
{
EmptyClipboard();
CString str;
char* pBuf;

HANDLE handle;

//從一個EditBox中得到要要放置到剪切板上的數據

GetDlgItemText(IDC_EDIT_SEND,str);

handle=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);//得到一個handle

//用handle得到一個指針

pBuf=(char*)GlobalLock(handle);
strcpy(pBuf,str);
GlobalUnlock(handle);
SetClipboardData( CF_TEXT  ,handle);

//關閉剪切板,不然其他的進程不能打開
CloseClipboard();
}

//從剪切板得到數據

if(OpenClipboard()/*判斷是否打開剪切板*/)
{
CString str;
char* pBuf;
HANDLE handle;

handle=GetClipboardData(CF_TEXT);
pBuf=(char*)GlobalLock(handle);


GlobalUnlock(handle);
SetDlgItemText(IDC_EDIT_RECV,pBuf);


CloseClipboard();

}

2.匿名管道

//匿名管道只適用於父子進程之間的通信,在父進程中創建匿名管道,然後啓動子進程,用ReadFile()和WriteFile()實現信息的發送與接收

//                    ParentProcess

//    OnCreatePipe

//先創建兩個HANDLE hRead

//                   HANDLE hWrite

{

SECURITY_ATTRIBUTES sa;
sa.bInheritHandle=TRUE;
sa.lpSecurityDescriptor=NULL;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
if(!CreatePipe(&hRead,&hWrite,&sa,0))
{
MessageBox("創建匿名管道失敗!");
return;
}
STARTUPINFO sui;
PROCESS_INFORMATION pi;
ZeroMemory(&sui,sizeof(STARTUPINFO));
sui.cb=sizeof(STARTUPINFO);
sui.dwFlags=STARTF_USESTDHANDLES;
sui.hStdInput=hRead;
sui.hStdOutput=hWrite;
sui.hStdError=GetStdHandle(STD_ERROR_HANDLE);

if(!CreateProcess("..\\Child\\Debug\\Child.exe",NULL,NULL,NULL,
TRUE,0,NULL,NULL,&sui,&pi))
{
CloseHandle(hRead);
CloseHandle(hWrite);
hRead=NULL;
hWrite=NULL;
MessageBox("創建子進程失敗!");
return;
}
else
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}

}


OnPipeRead()

{

char buf[100];
DWORD dwRead;
if(!ReadFile(hRead,buf,100,&dwRead,NULL))
{
MessageBox("讀取數據失敗!");
return;
}
MessageBox(buf);

}



OnPipeWrite()

{

char buf[]="http://www.baidu.com";
DWORD dwWrite;
if(!WriteFile(hWrite,buf,strlen(buf)+1,&dwWrite,NULL))
{
MessageBox("寫入數據失敗!");
return;
}

}



//ChildProcess

在初始化中將輸入輸出句柄設置爲標準輸入輸出 hRead=GetStdHandle(STD_INPUT_HANDLE);

                                                                                     hWrite=GetStdHandle(STD_OUTPUT_HANDLE);

讀寫函數和父進程基本一樣;

3.命名管道



4.郵槽

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章