Work hard
由于在啟動(dòng)一個(gè)進(jìn)程后,操作系統(tǒng)會(huì)給這個(gè)進(jìn)程分配 4GB 的私有地址空間,至于為何有 4GB 這么大,
那得考慮進(jìn)程的私有地址空間和實(shí)際物理內(nèi)存地址空間之間的映射以及頁交換等等細(xì)節(jié)問題了,這里不予討論,
既然操作系統(tǒng)給每一個(gè)進(jìn)程分配的是私有地址空間,自然,這段地址空間也只有這個(gè)進(jìn)程自己才能訪問了,既然這段私有地址空間只能由進(jìn)程本身訪問,那也就說明別的進(jìn)程是不能夠隨意的訪問這個(gè)進(jìn)程的地址空間的,
而上面又說任意兩個(gè)進(jìn)程之間是并能夠互相訪問對(duì)方的私有地址空間的,都不能訪問了,那還通信個(gè)屁啊 ?
自然上面的訪問對(duì)方進(jìn)程的私有地址空間是行不通了,那應(yīng)該還有其他辦法的 !!!
如果我在物理內(nèi)存中劃分出一塊內(nèi)存,這一塊內(nèi)存不為任何的進(jìn)程所私有,但是任何的進(jìn)程又都可以訪問這塊內(nèi)存,
那么 進(jìn)程 A 就可以往這塊內(nèi)存中存放數(shù)據(jù) Data ,然后 進(jìn)程 B 也是可以訪問這塊內(nèi)存的,從而 進(jìn)程 B 就可以訪問到數(shù)據(jù) Data 了,
這樣不就實(shí)現(xiàn)了 進(jìn)程 A 和 進(jìn)程 B 之間的通信了 !!!
而上面的這種思路就是剪貼板了。
當(dāng)然解決進(jìn)程間通信還有好幾種思路,本文暫只介紹利用剪貼板來實(shí)現(xiàn)進(jìn)程間的通信。前面這段話是我抄過來的,呵呵,自己寫不了這種書面語。我寫一下我對(duì)剪貼板的使用,我也是新學(xué)的,有不對(duì)的地方還請(qǐng)大家指點(diǎn)。向剪貼板中寫入數(shù)據(jù)打開剪貼板 OpenClipboard清空剪貼板 EmptyClipboard設(shè)置剪貼板數(shù)據(jù)SetClipboardData關(guān)閉剪貼板CloseClipboard從剪貼板讀取數(shù)據(jù)打開剪貼板 OpenClipboard判斷數(shù)據(jù)類型IsClipboardFormatAvailable得到剪貼板數(shù)據(jù)GetClipboardData關(guān)閉剪貼板CloseClipboard我在說下具體的函數(shù)怎么用Openclipboard大家在msdn上可以看到 僅有一個(gè)參數(shù)hWndNewOwner;這個(gè)參數(shù)表明那個(gè)窗口擁有剪貼板的使用權(quán) 已在此窗口中打開,別的窗口中調(diào)用openclipboard就會(huì)失敗這個(gè)參數(shù)可以設(shè)置成null。If this parameter is NULL, the open clipboard is associated with the current task呵呵,這個(gè)設(shè)成null之后 在后邊的 setclipboarddata 就不能采用延遲發(fā)送了。因?yàn)?#8230;…等會(huì)說延遲發(fā)送就會(huì)知道了。(這是我試驗(yàn)得出的結(jié)論,應(yīng)該沒問題)這個(gè)參數(shù)我們暫且設(shè)為窗口句柄 m_hWnd(我用的MFC編的)EmptyClipboard這個(gè)函數(shù)就沒什么說的了。就是清空剪貼板的數(shù)據(jù) 還有就是The function then assigns ownership of the clipboard to the window that currently has the clipboard open.SetClipboardData( UINT uFormat, HANDLE hMem);有兩個(gè)參數(shù)第一個(gè)參數(shù)是數(shù)據(jù)類型 我們?cè)O(shè)置成CF_UNICODETEXT。第二個(gè)參數(shù)是the hMem parameter identifies a memory object, the object must have been allocated using the function with the GMEM_MOVEABLE flag.這句話得意思就是 hmem是塊內(nèi)存對(duì)象的句柄 這塊內(nèi)存要是GMEM_MOVEABLE 型的。這又要引進(jìn)一個(gè)申請(qǐng)內(nèi)存的函數(shù)。平常我們用的malloc new 等都是在自己的進(jìn)程中申請(qǐng)空間,如果用他們 我們的通信也就通不成了。所以我們要申請(qǐng)個(gè)全局的內(nèi)存空間GlobalAlloc(GMEM_MOVEABLE,dwBytes);第一個(gè)參數(shù)就是可移動(dòng)的意思(當(dāng)別人申請(qǐng)一塊大空間的時(shí)候 比如我們申請(qǐng)的空間比較散亂占用了一部分空間 別人就申請(qǐng)不了一整塊大的空間了。這樣我們的空間如果是可移動(dòng)的,就會(huì)被移動(dòng)的凝聚一些,別人就有地方申請(qǐng)大的空間了,紅色是我們申請(qǐng)的凌亂的空間,綠色是又想申請(qǐng)的一大塊)。這個(gè)我不在這里多講,內(nèi)存管理我懂的也不太多。不懂的可以找找內(nèi)存管理方面的書。 第二個(gè)參數(shù)就是空間大小。這樣我們完成了設(shè)置剪貼板數(shù)據(jù) ,然后我們關(guān)閉剪貼板就行了。讀取簡單一些。::OpenClipboard(m_hWnd)IsClipboardFormatAvailable(CF_UNICODETEXT)//判斷剪貼板內(nèi)數(shù)據(jù)類型HANDLE hClip=::GetClipboardData(CF_UNICODETEXT)//得到剪貼板的句柄然后就是使用里面的數(shù)據(jù)了。這里要注意,一定要給數(shù)據(jù)上鎖 ,就是說我們?cè)谑褂脭?shù)據(jù)的這個(gè)時(shí)間內(nèi),別人不準(zhǔn)移動(dòng)我們的內(nèi)存。這個(gè)大家能理解吧。TCHAR * p=(TCHAR *)GlobalLock(hClip);//強(qiáng)制裝換成我們的寬字符 上鎖MessageBox(p);輸出即可 GlobalUnlock(hClip); 解鎖 ::CloseClipboard();這就完成了,我貼一段代碼上來哦
然后最后我在說說延遲發(fā)送setclipboarddata 的第二個(gè)參數(shù)傳為null 就為延遲發(fā)送延遲發(fā)送就是一開始點(diǎn)寫入剪貼板的時(shí)候不寫入,然后另一個(gè)進(jìn)程想要得到剪貼板里的信息的時(shí)候也就是在getclipboarddata時(shí)系統(tǒng)會(huì)發(fā)個(gè)消息給我們以前的那個(gè)窗口 還記得openclipboard傳的那個(gè)m_hWnd了吧,就是給這個(gè)窗口發(fā)個(gè)消息WM_RENDERFORMAT然后你在這個(gè)消息響應(yīng)函數(shù)中進(jìn)行把數(shù)據(jù)寫入剪貼板。還有一種情況就是你在想粘貼的時(shí)候 你的原先寫入的那個(gè)程序已經(jīng)關(guān)閉了,這樣的話你就帖不了了。 這樣 還有一個(gè)消息如果你選擇了延遲發(fā)送 然后關(guān)閉應(yīng)用程序的話,就會(huì)響應(yīng)一個(gè)WM_RENDERALLFORMATS消息 那么你在這個(gè)響應(yīng)函數(shù)中把你要寫入剪貼板得數(shù)據(jù)寫入 就可以避免這種情況了。啊 累死我了,可下寫完了。。。。
posted on 2011-07-31 17:11 陳曉 閱讀(2047) 評(píng)論(0) 編輯 收藏 引用
Powered by: C++博客 Copyright © 陳曉