乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       昵稱(chēng)29123320 2015-11-10

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


      一.控制臺(tái)程序
      盡管有很多人將控制臺(tái)程序(CONSOLE)也稱(chēng)為DOS程序,但是我在這里還是要將它和MS-DOS程序區(qū)分一下。首先它們倆確實(shí)有點(diǎn)相似:它們執(zhí)行時(shí)沒(méi)有圖形界面。但是它們之間的區(qū)別卻是根本的:
      1.    控制臺(tái)程序是32位的,與GUI(圖形用戶(hù)界面)程序一樣,都為PE格式;DOS程序卻是16位的,為MZ格式。
      2.    在XP中運(yùn)行時(shí),控制臺(tái)程序和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è)控制臺(tái)程序;commond.com是一個(gè)16位DOS程序。

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

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

      當(dāng)使用CreateProcess函數(shù)創(chuàng)建的子進(jìn)程為控制臺(tái)程序,我們可以使用STARTUPINFO結(jié)構(gòu)來(lái)改變?cè)撟舆M(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è)成員才有效。

      我們可以將文件句柄、管道句柄或者其它任何可以通過(guò)ReadFile/WriteFile來(lái)進(jìn)行同步讀寫(xiě)的句柄設(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í)必須為T(mén)RUE。
      通過(guò)上面的設(shè)置,創(chuàng)建的子控制臺(tái)程序便可以重定向標(biāo)準(zhǔn)句柄了。

      三.舉例
      下面舉一個(gè)簡(jiǎn)單的例子,將創(chuàng)建的控制臺(tái)程序的輸出指向一個(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; //一定為T(mén)RUE.
        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./KB/cpp/9505Yamaha_1.aspx

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多