CreateProcess実行プログラム+コマンドラインを使用してhtmlファイルを印刷する


通常、プログラムを書くときに外部プログラムインスタンスやコマンドラインを実行する場合がよくあります.これはCreateProcessを使用して実現できます.
私たちのプログラムでは通常、外部プログラムまたはコマンドラインを実行するだけなので、後続の制御は必要ありません.そこで、私はこの操作を簡単に操作できる関数CreateProcessQuickにカプセル化しました.一般的に、アプリケーション名は指定する必要はありません.私たちは後のコマンドラインパラメータを指定するだけです.notepadプログラムを実行する場合は、lpCommandLineを「notepad」と指定するだけです.
最近の機能の1つは、プログラムでhtmlファイルを印刷することを指定することです.パスは既知です.プロセスエクスプローラを使用して印刷ファイルダイアログボックスのコマンド動作を表示する
"rundll32.exe"C:\Windows\system32\mshtml.dll,PrintHTML "C:\Users\cashey\Desktop\basicshow.tem.html"
注意:「rundll 32.exe」C:Windowssystem 32mshtml.dll、PrintHTML「ファイルフルパス」
#include 

BOOL CreateProcessQuick(LPCTSTR lpApplicationName, LPTSTR lpCommandLine = NULL)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
    
    BOOL bRet = CreateProcess(lpApplicationName, 
                              lpCommandLine, 
                              NULL, 
                              NULL, 
                              FALSE, 
                              0, 
                              NULL, 
                              NULL, 
                              &si, 
                              &pi);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    return bRet; 
}

int main()
{
    LPTSTR lpCommandLine = TEXT("\"rundll32.exe\" C:\\Windows\\system32\\mshtml.dll,PrintHTML \"C:\\Users\\cashey\\Desktop\\basicshow.tem.html\"");
    CreateProcessQuick(NULL, lpCommandLine);
    return 0;
} 

注意CreateProcessQuickコードではCreateProcessが呼び出された後に再度CloseHandleが呼び出されます.これは、カーネルオブジェクトの漏洩を防止するためです.このプロセスを作成した後、このプロセスで制御する必要がないため、スレッドとプロセスハンドルを閉じることができます.ここでCloseHandleはハンドルを閉じただけで、作成したプロセスは終了しません.プロセスは「参照カウント」を行うため、プロセスハンドルの参照カウントが0に下がらない限り、プロセスのカーネルオブジェクトはクリーンアップされません.(『Windowsコアプログラミング』参照)