免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
控制臺程序的標(biāo)準(zhǔn)句柄的重定向 - CSDN博客

控制臺程序的標(biāo)準(zhǔn)句柄的重定向


一.控制臺程序
盡管有很多人將控制臺程序(CONSOLE)也稱為DOS程序,但是我在這里還是要將它和MS-DOS程序區(qū)分一下。首先它們倆確實(shí)有點(diǎn)相似:它們執(zhí)行時(shí)沒有圖形界面。但是它們之間的區(qū)別卻是根本的:
1.    控制臺程序是32位的,與GUI(圖形用戶界面)程序一樣,都為PE格式;DOS程序卻是16位的,為MZ格式。
2.    在XP中運(yùn)行時(shí),控制臺程序和GUI程序一樣可以直接運(yùn)行;而要運(yùn)行DOS程序,系統(tǒng)先得運(yùn)行ntvdm.exe,這是一個(gè)32位的V86虛擬機(jī)程序,然后再將DOS程序放在這個(gè)虛擬機(jī)中運(yùn)行。
XP下cmd.exe是一個(gè)控制臺程序;commond.com是一個(gè)16位DOS程序。

只有控制臺程序的標(biāo)準(zhǔn)句柄是可以重定向的,也是本文要討論的;16位DOS程序是不行的。

二.創(chuàng)建控制臺程序時(shí)重定向標(biāo)準(zhǔn)句柄

當(dāng)使用CreateProcess函數(shù)創(chuàng)建的子進(jìn)程為控制臺程序,我們可以使用STARTUPINFO結(jié)構(gòu)來改變該子進(jìn)程的標(biāo)準(zhǔn)句柄(standard handles):
   句柄                     解釋
hStdInput       子進(jìn)程的標(biāo)準(zhǔn)輸入句柄
hStdOutput    子進(jìn)程的標(biāo)準(zhǔn)輸出句柄
hStdError       子進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤句柄
這三個(gè)成員由dwFlags中的STARTF_USESTDHANDLES控制。只有置上這個(gè)標(biāo)志上述三個(gè)成員才有效。

我們可以將文件句柄、管道句柄或者其它任何可以通過ReadFile/WriteFile來進(jìn)行同步讀寫的句柄設(shè)置為子進(jìn)程的標(biāo)準(zhǔn)句柄。

因?yàn)樵诟高M(jìn)程中創(chuàng)建的句柄想在子進(jìn)程中使用,所以在調(diào)用CreateProcess(bInheritHandles參數(shù))以及CreateFile(sa. bInheritHandles參數(shù))時(shí)必須為TRUE。
通過上面的設(shè)置,創(chuàng)建的子控制臺程序便可以重定向標(biāo)準(zhǔn)句柄了。

三.舉例
下面舉一個(gè)簡單的例子,將創(chuàng)建的控制臺程序的輸出指向一個(gè)文件句柄。
Procedure CreateConsoleProcess(strFileName: String);
Var
  si: TSTARTUPINFO;
  sa: TSECURITYATTRIBUTES;
  pi: PROCESS_INFORMATION;
  hFile: THANDLE;
begin
  //創(chuàng)建文件句柄
  ZeroMemory(@sa, sizeof(sa));
  sa.nLength := sizeof(sa);
  sa.bInheritHandle := TRUE; //一定為TRUE.
  hFile := CreateFile('c:/Log.txt', GENERIC_WRITE, FILE_SHARE_READ, @sa, CREATE_ALWAYS, 0, 0);
  if (hFile = INVALID_HANDLE_VALUE) then
  begin
    MessageBox(0, '日志文件創(chuàng)建失敗!', '程序', MB_ICONERROR or MB_OK);
    Exit;
  end;
 
//設(shè)置STARTUPINFO結(jié)構(gòu)
  ZeroMemory(@si, sizeof(TSTARTUPINFO));
  si.cb := sizeof(si);
  si.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
  si.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
  si.hStdOutput := hFile;
  si.hStdError := hFile;
  si.wShowWindow := SW_HIDE;

  if CreateProcess(nil, PCHAR(strFileName), nil, nil, TRUE, 0, nil, nil, si, pi) = FALSE then
    MessageBox(0, '進(jìn)程創(chuàng)建失??!', '程序', MB_ICONERROR or MB_OK)
  else
    WaitForSingleObject(pi.hProcess, INFINITE);
  CloseHandle(hFile);
end;

四.進(jìn)一步閱讀

1.http://blog.csdn.net/mynote/archive/2005/02/19/293369.aspx
2.http://blog.csdn.net/yangjiudan/archive/2006/04/29/697517.aspx
3.http://groups.google.com/group/comp.os.ms-windows.programmer.win32/browse_thread/thread/44decc1599b114b2
4.http://hi.baidu.com/estly/blog/item/a7495a901f938b8fa977a4b8.html
5.http://support.microsoft.com/kb/190351
6.http://www.codeproject.com/KB/cpp/9505Yamaha_1.aspx

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Win32中進(jìn)程的輸入輸出重定向
批處理技術(shù)內(nèi)幕:重定向與句柄 | Demon's Blog
共享內(nèi)存的使用
調(diào)用DOS窗口
關(guān)于vs2010運(yùn)行C程序時(shí),運(yùn)行結(jié)果窗口一閃而過的問題
C#控制臺應(yīng)用程序執(zhí)行結(jié)果一閃而過的解決方法
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服