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