<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 20.7 調用別的應用程序 有時候你需要從你的應用程序中啟動別的應用程序,可能是一個瀏覽器或者是你自己寫的另外一個程序.wxExecute函數是一個功能很強大的函數,它的功能包括: 帶參數或者不帶參數調用別的程序,同步或者異步執行程序,搜集別的程序的輸出,以及重定向別的程序的輸入和輸出以便實現和當前程序的交互. 啟動一個應用程序 下面是wxExecute函數的一個簡單的例子: ``` // 異步執行程序(默認行為),函數將會立即返回. wxExecute(wxT("c:\\windows\\notepad.exe")); // 同步執行程序,函數在Notepad程序退出以后才會返回. wxExecute(wxT("c:\\windows\\notepad.exe c:\\temp\\temp.txt"), wxEXEC_SYNC); ``` 注意一般來說你可以將參數和可執行文件用引號括起來,這在路徑中包含空格的時候是很有用的. 打開文檔 如果你啟動一個外部程序的目的是打開一個文檔,在Windows或者Linux平臺上,你可以使用wxMimeTypesManager 類.你可以使用它來獲得打開某種類型的文檔所需要執行的程序的路徑,然后使用它來構造wxExecute函數的參數,比如,如果你想打開一個HTML文件,你可以使用下面的方法: ``` wxString url = wxT("c:\\home\\index.html"); bool ok = false; wxFileType *ft = wxTheMimeTypesManager-> GetFileTypeFromExtension(wxT("html")); if ( ft ) { wxString cmd; ok = ft->GetOpenCommand(&cmd, wxFileType::MessageParameters(url, wxEmptyString)); delete ft; if (ok) { ok = (wxExecute(cmd, wxEXEC_ASYNC) != 0); } } ``` 不幸的是,這種方法不適用于Mac OSX平臺,因為Mac OSX平臺使用完全不同的文檔打開機制.對于任何別的文件類型,最好使用系統提供的Finder程序來打開,而對于HTML文件,你可以直接使用系統函數 ICLaunchURL.wxExecute有時候并不是最好的選擇,在windows平臺上,如果要打開HTML文件,你可以直接使用 ShellExecute函數會更有效率.即使在Unix平臺上,你可能也要作好指定的程序不存在的準備,如果它確實不存在,你可以考慮使用別的程序比如 htmlview. 為了避免上述的這些問題,我們在隨書光盤的examples/chap20/launch目錄中,實現了一些函數,比如: wxLaunchFile,wxViewHTMLFile,wxViewPDFFile,wxPlaySoundFile,它們的功能一目了然,并且它們可以同時支持Windows,Linux和Mac OsX平臺. wxLaunchFile是一個普通意義上的文本打開函數.參數包括一個文檔文件名或者一個可執行文件名附帶可選的參數,以及一個可選的錯誤消息字符串,這個字符串在執行失敗的時候顯示給用戶.如果當前正在打開的文檔是HTML類型的文檔,wxLaunchFile函數將調用 wxViewHTMLFile函數.在Mac OsX平臺上,這個函數將使用Finder打開文檔,而在別的平臺上則使用wxMimeTypesManager.注意在Mac OSX平臺上,有時候文檔會在非活動的窗口上打開,這時候你可以通過osascript這個命令行工具來將它提到前臺,如下所示(比如): ``` wxExecute(wxT("osascript -e \"tell application \\\"AcmeApp\\\"\" -e \"activate\" -e \"end tell\"")); ``` 在Linux平臺上, wxViewHTMLFile, wxViewPDFFile和wxPlaySoundFile都包含fallbacks機制以便在相應的可執行文件不存在的時候使用.你可以按照自己的需要調整相應的fallbacks設置. wxPlaySoundFile是用來使用外部程序播放那些大型的聲音文件的,如果只是播放一個很小的聲音文件,你可以直接使用wxSound. 重定向進程的輸入和輸出 有時候,你希望捕獲另外一個進程的輸入和輸出,以便你或者你的用戶可以控制那個進程.比起重頭寫實現某個功能的代碼來說,這樣作顯然可以給你減少不少的工作量.而wxExecute可以幫助實現捕獲和控制那些控制臺程序的輸入和輸出. 要實現這個功能,你需要在調用wxExecute函數的時候傳遞一個wxProcess的實例,這個實例的OnTerminate函數將在進程結束的時候被調用,這個實例可以用來捕獲進程的輸出或者控制進程的輸入. 在wxWidgets自帶的samples/exec目錄中,你可以找到各種各樣使用wxExecute的例子,我們也提供了另外一個例子,它將GDB集成進自己的程序中去,你可以參考examples/chap20/pipedprocess中的代碼.我們沒有提供用于工具條的那些小圖片以及整個可編譯的代碼,如果提供了這些,它將可以支持包括windows,linux和Mac OSX在內的各種平臺,只要那些平臺上安裝了GDB. debugger.h和debugger.cpp文件實現了一個管道化的進程和一個窗口,這個窗口包含一個工具條和一個文本框,用來顯示GDB的輸出和從用戶那里獲取輸入并且把它發送給GDB. textctrlex.h和textctrlex.cpp則實現了一個派生自wxStyledTextCtrl的控件,包括一些和wxTextCtrl兼容的函數和標準事件處理函數比如復制,剪切,粘貼,重做和撤消等. processapp.h和processapp.cpp實現了一個應用程序類,這個類可以在空閑的時候處理來自多個進程的輸入. GDB是通過下面的語句啟動的: ``` DebuggerProcess *process = new DebuggerProcess (this); m_pid = wxExecute(cmd, wxEXEC_ASYNC, process); ``` 可以使用下面的代碼殺死這個進程: ``` wxKill(m_pid, wxSIGKILL, NULL, wxKILL_CHILDREN); ``` 要給調試器發送一個命令,將會設置一個內部的變量以便通知應用程序在空閑的時候處理這個輸入. ``` // 給調試器發送一個命令 bool DebuggerWindow::SendDebugCommand(const wxString& cmd, bool needEcho) { if (m_process && m_process->GetOutputStream()) { wxString c = cmd; c += wxT("\n"); if (needEcho) AddLine(cmd); // 這個函數只是簡單的對m_input變量賦值 // OnIdle函數中的HasInput函數將檢查這個變量. m_process->SendInput(c); return true; } return false; } ``` HasInput函數被應用程序在其空閑時間周期性的調用,它的責任是發送用戶輸入的命令到進程并且從進程讀取來自標準輸出和標準錯誤的輸出: ``` bool DebuggerProcess::HasInput() { bool hasInput = false; static wxChar buffer[4096]; if ( !m_input.IsEmpty() ) { wxTextOutputStream os(*GetOutputStream()); os.WriteString(m_input); m_input.Empty(); hasInput = true; } if ( IsErrorAvailable() ) { buffer[GetErrorStream()->Read(buffer, WXSIZEOF(buffer) - 1).LastRead()] = _T('\0'); wxString msg(buffer); m_debugWindow->ReadDebuggerOutput(msg, true); hasInput = true; } if ( IsInputAvailable() ) { buffer[GetInputStream()->Read(buffer, WXSIZEOF(buffer) - 1).LastRead()] = _T('\0'); wxString msg(buffer); m_debugWindow->ReadDebuggerOutput(buffer, false); hasInput = true; } return hasInput; } ``` 注意上面這個例子和wxWidgets自帶的exec例子的一個關鍵的不同在于,exec例子每次從進程讀取一行,如果進程的輸出沒有帶換行符,將導致應用程序被阻塞.而在我們的例子中,使用了一個緩沖區來保存盡可能多的輸入,這是一種更安全的作法. ProcessApp類可以直接被用作你的應用程序的基類,或者你可以拷貝它的成員函數到你的應用程序類中去.它維護了一個進程列表,進程可以通過RegisterProcess和UnregisterProcess函數登記和注銷, 進程輸入和輸出的處理在系統空閑時間完成.如下所示: ``` // 任何緩存的輸入都在系統空閑時處理 bool ProcessApp::HandleProcessInput() { if (!HasProcesses()) return false; bool hasInput = false; wxNode* node = m_processes.GetFirst(); while (node) { PipedProcess* process = wxDynamicCast(node->GetData(), PipedProcess); if (process && process->HasInput()) hasInput = true; node = node->GetNext(); } return hasInput; } void ProcessApp::OnIdle(wxIdleEvent& event) { if (HandleProcessInput()) event.RequestMore(); event.Skip(); } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看