Windows 下的程序間通訊及資料共享

2021-05-04 03:44:29 字數 1150 閱讀 7095

windows 下有很多方法實現程序間通訊,比如用 socket,管道(pipe),信箱(mailslot),等等。但最基本最直接的還是使用記憶體共享。其他方法最終還是會繞道這裡。

可想而知,如果物理記憶體只有乙份,讓這份內存在不同的程序中,對映到各自的虛擬位址空間上,每個程序都可以讀取同乙份資料,是一種最高效的資料交換方法。下面我們就討論如何實現它。

大約是這樣:

這樣,在 createprocess 的時候,如果 binherithandles 引數為 true ,所有有可被繼承屬性的核心物件都會被複製到子程序中。

注:核心物件的繼承就是在 createprocess 建立子程序,但是子程序的主線程尚未活動之前,核心掃瞄當前程序中所有核心物件,檢查出有可繼承屬性的那些,再用 duplicatehandle 複製乙份到子程序。由於是核心物件,在核心中實質只有乙份,所有只是引用記數加一,父程序和子程序對同一核心物件的 handle 一定是相同的。

複製核心物件的過程是由 createprocess 內部完成的,我們可以放心的把物件 handle (和子程序相同) 通過命令列傳遞給子程序。或者,用環境變數傳遞也可以。

createprocess("test.exe","test argument",...);

這樣就是錯誤的,因為 "test argument" 會被編譯器編譯放到不可修改的資料段中。正確的方法是:

char cmdline="test argument";

createprocess("test.exe",cmdline,...);

這樣,命令列的字串就被放在堆疊上,是可以被讀寫的。

createprocess 的倒數第二個引數需要填寫乙個 startupinfow 結構,這個結構很複雜,通常填起來很麻煩。我們可以複製乙份父程序的結構,再酌情修改。方法是:

startupinfo si=;

process_information pi;

getstartupinfo(&si);

createprocess(...,&si,& pi);

這裡, startupinfo 結構的第乙個長度資訊通常應該填上,保證 getstartupinfo(&si); 的正確執行。

引用:http://blog.codingnow.com/2005/10/interprocess_communications.html

Windows下程序間通訊

1 程序與程序通訊 2 程序通訊方法 2.1 檔案對映 win32 api中共享記憶體 shared memory 實際就是檔案對映的一種特殊情況。程序在建立檔案對映物件時用0xffffffff來代替檔案控制代碼 handle 就表示了對應的檔案對映物件是從作業系統頁面檔案訪問記憶體,其它程序開啟該...

Windows下程序間通訊及資料共享

程序是裝入記憶體並準備執行的程式,每個程序都有私有的虛擬位址空間,由 資料以及它可利用的系統資源 如檔案 管道等 組成。win32 api中共享記憶體 shared memory 實際就是檔案對映的一種特殊情況。程序在建立檔案對映物件時用0xffffffff來代替檔案控制代碼 handle 就表示了...

windows下程序間通訊與執行緒間通訊

程序間通訊 只需簡單的指標操作就可讀取和修改檔案的內容。win32 api允許多個程序訪問同一檔案對映物件,各個程序在它自己的位址空間裡接收記憶體的指標通過使用這些指標,不同程序就可以讀或修改檔案的內容,實現對檔案中資料的共享。檔案對映是在多個程序間共享資料的非常有效方法,有較好的安全性。但檔案對映...