在VC中使用Windows管道技術程式設計

2021-12-29 16:35:00 字數 1534 閱讀 3136

我們要改的地方有這麼幾個:cb,dwflags,hstdoutput,hstderror,wshowwindow。先說cb,他指的是 startupinfo的大小,還是老手法sizeof。再說wshowwindow,他制定了新程序建立時視窗的現實狀態,這個屬性當然給為 sw_hide了,我們不是要隱藏新建的dos程序嗎。哈哈,看到hstdoutput和hstderror,標準輸出和錯誤輸出的控制代碼。關鍵的地方來了,只要我們把這兩個控制代碼設定為hwrite,我們的程序一旦有標準輸出,就會被寫入我們剛剛建立的匿名管道裡,我們再用管道的hreadpipe控制代碼把內容讀出來寫入edit控制項不就達到我們的目的了嗎。呵呵,說起來也真是聽容易的阿。這幾個關鍵引數完成了以後,千萬別忘了dwflags。他是用來制定 startupinfo裡這一堆引數那個有效的。既然我們用了hstdoutput,hstderror和wshowwindow那dwflags就給為 startf_useshowwindow | startf_usestdhandles。

現在回到createprocess的最後乙個引數lpprocessinformation(累!)。呵呵,這個引數不用自己填了,他是createprocess返回的資訊,只要給他乙個process_information結構事例的位址就行了。

大功高成了,我們管道一端連在了新程序的標準輸出端了,一端可以自己用api函式readfile讀取了。等等,不對,我們的管道還有問題。我們把 hwrite給了hstdoutput和hstderror,那麼在新的程序啟動時就會在新程序中開啟乙個管道寫入端,而我們在當前程序中使用了 createpipe建立了乙個管道,那麼在當前程序中也有這個管道的寫入端hwrite。好了,這裡出現了乙個有兩個寫入端和乙個讀出端的畸形管道。這樣的管道肯定是有問題的。由於當前程序並不使用寫端,因此我們必須關閉當前程序的寫端。這樣,我們的管道才算真正的建立成功了。來看看vc++寫的源程式:

/** 通過管道技術,將dir /?的幫助資訊輸入到mfc應用程式的乙個cedit控制項中。

* vc++6.0 + winxp 通過

** detrox, 2003

*/void cpipedlg::onbutton1()

startupinfo si;

process_information pi;

si.cb = sizeof(startupinfo);

getstartupinfo(&si);

si.hstderror = hwrite;

si.hstdoutput = hwrite;

si.wshowwindow = sw_hide;

si.dwflags = startf_useshowwindow | startf_usestdhandles;

if (!createprocess(null,"c:\windows\system32\cmd.exe/c dir /?"

,null,null,true,null,null,null,&si,&pi))

closehandle(hwrite);

char buffer[4096] = ;

dword bytesread;

while (true)

在VC中使用CCheckListBox

在軟體應用中經常會遇到需要複選功能的列表框。類cchecklistbox實現了windows複選列表框。複選列表框顯示項的乙個列表,例如檔名列表。列表中的每項都有乙個核取方塊,方便使用。但是vc的控 件列表中並新增cchecklistbox,因此在使用cchecklistbox還要進行一些手動設定,...

在VC中使用Debug

選定debug編譯選項 build set active configuration win32 debug 或者在build工具欄上的listbox中選擇debug。debug定義了 debug巨集,而release定義了ndebug巨集。先按f12編譯browse資訊 這樣編譯後可以查到變數定義...

在VC中使用GDI

gdi 可應用於二維向量圖象,柵格圖象及排版,是為c c 程式設計師而設計的表現為c 類而存在的介面,能用於一切基於windows的應用中。作為gdi的後繼者,gdi 在gdi中增加了新功能,如文字的反鋸齒,漸變筆刷,alpha溶合 也優化了gdi許多已有的功能。此外,gdi 改變了程式設計模式,使...