平時寫程序時經常會遇到要執行一個外部程序實例或者某個命令行的情況,這可以使用CreateProcess來實現。
由於我們程序中通常只是將外部程序或者一個命令行運行起來,並不需要進行後續的控制,於是我將這個操作封裝成了一個方便快速操作的函數CreateProcessQuick,一般情況下,應用程序名稱不需要指定,我們只需指定後面的命令行參數。如果是運行notepad程序,則只需要指定lpCommandLine爲"notepad"。
近期所做的一個功能是在程序中指定打印一個html文件,路徑已知。使用processexplorer查看打印文件對話框的命令行爲
"rundll32.exe" C:\Windows\system32\mshtml.dll,PrintHTML "C:\Users\cashey\Desktop\basicshow.tem.html"
注:即"rundll32.exe" C:\Windows\system32\mshtml.dll,PrintHTML "文件完整路徑"
#include <windows.h>
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核心編程》)