C++中外部程序的調(diào)用

字號(hào):

有三種SDK函數(shù)可以調(diào)用,分別是:
    WinExec, ShellExecute,CreateProcess
    其中以WinExec最為簡(jiǎn)單,ShellExecute比WinExec靈活一些,CreateProcess最為復(fù)雜。
    WinExec 有兩個(gè)參數(shù),前一個(gè)指定路徑,后一個(gè)指定顯示方式。
    ShellExecute 可以指定工作目錄,并且還可以尋找文件的關(guān)聯(lián)直接打開(kāi)不用加載與文件關(guān)聯(lián)的應(yīng)用程序,ShellExecute還可以打開(kāi)網(wǎng)頁(yè),啟動(dòng)相應(yīng)的郵件關(guān)聯(lián)發(fā)送郵件等等。
    CreateProcess 一共有十個(gè)參數(shù),不過(guò)大部分都可以用NULL代替,它可以指定進(jìn)程的安全屬性,繼承信息,類的優(yōu)先級(jí)等等。如果我們要得到足夠多的關(guān)于新的進(jìn)程的信息,控制新的進(jìn)程的細(xì)節(jié)屬性,若要達(dá)到這些目的,就需要使用CreateProcess函數(shù)了。
    具體用法如下:
    WinExec
    這個(gè)函數(shù)最簡(jiǎn)單,只有兩個(gè)參數(shù),原型如下:
    UINT WinExec(
    LPCSTR lpCmdLine, // 命令路徑
    UINT uCmdShow // 顯示方式,共有11種,具體可以查閱MSDN的ShowWindow函數(shù)
    );
    使用方法如下:
    WinExec("Notepad.exe", SW_SHOW); // 打開(kāi)記事本
    WinExec("D:\\Program Files\\Test\\Test.exe",SW_SHOWMAXIMIZED); // 以化的方式打開(kāi)Test.exe(注意文件名的大小寫(xiě)也必須完全一樣)
    需要注意的是若用 SW_SHOWMAXMIZED 方式去加載一個(gè)無(wú)化按鈕的程序,譬如Calc (計(jì)算器),就不會(huì)出現(xiàn)正常的窗體,但是已經(jīng)被加到任務(wù)列表里了。
    ShellExecute
    原型如下:
    HINSTANCE ShellExecute(
    HWND hwnd, //父窗口句柄
    LPCTSTR lpOperation, //操作, 打開(kāi)方式"edit","explore","open","find","print","NULL"
    LPCTSTR lpFile, //文件名,前面可加路徑
    LPCTSTR lpParameters, //參數(shù)
    LPCTSTR lpDirectory, //默認(rèn)文件夾
    INT nShowCmd //顯示方式
    );
    使用方法如下:
    ShellExecute(NULL,"open","C:\\Test.txt",NULL,NULL,SW_SHOWNORMAL); // 打開(kāi)C:\Test.txt 文件
    ShellExecute(NULL, "open", "http://www.google.com", NULL, NULL, SW_SHOWNORMAL); // 打開(kāi)網(wǎng)頁(yè)www.google.com
    ShellExecute(NULL,"explore", "D:\\C++",NULL,NULL,SW_SHOWNORMAL); // 打開(kāi)目錄D:\C++
    ShellExecute(NULL,"print","C:\\Test.txt",NULL,NULL, SW_HIDE); // 打印文件C:\Test.txt
    注意:ShellExecute不支持定向輸出。
    CreateProcess
    原型如下:
    BOOL CreateProcess(
    LPCTSTR lpApplicationName, //執(zhí)行程序名
    LPTSTR lpCommandLine, // 參數(shù)行
    //下面兩個(gè)參數(shù)描述了所創(chuàng)建的進(jìn)程和線程的安全屬性,如果為NULL則使用默認(rèn)的安全屬性
    LPSECURITY_ATTRIBUTES lpProcessAttributes, //process security attributes
    LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
    BOOL bInheritHandles, // 繼承標(biāo)志
    DWORD dwCreationFlags, // 創(chuàng)建標(biāo)志
    LPVOID lpEnvironment, // 環(huán)境變量
    LPCTSTR lpCurrentDirectory, // 運(yùn)行該進(jìn)程的初始目錄
    LPSTARTUPINFO lpStartupInfo, // 用于在創(chuàng)建子進(jìn)程時(shí)設(shè)置各種屬性
    LPPROCESS_INFORMATION lpProcessInformation //用于在進(jìn)程創(chuàng)建后接受相關(guān)信息
    );
    使用方法如下:
    PROCESS_INFORMATION pi; //啟動(dòng)窗口的信息
    STARTUPINFO si; //進(jìn)程的信息
    memset(&si,0,sizeof(si));
    si.cb=sizeof(si);
    si.wShowWindow=SW_SHOW;
    si.dwFlags=STARTF_USESHOWWINDOW;
    bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
    由此,我就設(shè)計(jì)了三個(gè)按鈕,分別用這三種函數(shù)調(diào)用了三個(gè)應(yīng)用程序,設(shè)置在每個(gè)按鈕的ONCLICK消息中:
    WinExec("taskmgr",SW_NORMAL); //調(diào)用系統(tǒng)任務(wù)管理器
    ShellExecute(NULL,"open","C:\ReadMe.txt","","",SW_SHOW); //打開(kāi)C盤下的ReadMe文件
    STARTUPINFO si={sizeof(si)};
    PROCESS_INFORMATION pi;
    CreateProcess(NULL,"cleanmgr",NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); //調(diào)用系統(tǒng)的清理磁盤程序
    編譯運(yùn)行后都通過(guò)了,我的對(duì)話框終于有了一點(diǎn)用處,可以通過(guò)單擊按鈕執(zhí)行一些應(yīng)用程序了。
    考試大提示:使用這三個(gè)函數(shù)也有一些注意事項(xiàng):
    1、定義頭文件
    在頭文件stdafx.h中必須定義以下兩個(gè)頭文件:
    #include // 可替換為 windows.h
    #include
    如果定義了頭文件 #include 的話就不必定義 #include 了,"windows.h" 不光是包含了"shellapi.h",它還定義了許多數(shù)據(jù)類型,如果沒(méi)有這些數(shù)據(jù)類型,shellapi.h本身會(huì)出錯(cuò)。
    2、定義路徑
    C++中所表示的路徑要用 " \\ "而不是平常所用的" \ ",所以以上三個(gè)函數(shù)表示路徑都為:
    Disk:\\Directory\\...\\File name