CreateProcessAsUser 函數
如果想通過服務向桌面用戶Session 創建一個復雜UI 程序界面,則需要使用CreateProcessAsUser 函數為用戶創建一個新進程用來運行相應的程序。打開Interop 類繼續添加下面代碼:
先看函數原型
BOOL WINAPI CreateProcessAsUser(
_In_opt_ HANDLE hToken,
_In_opt_ LPCTSTR lpApplicationName,
_Inout_opt_ LPTSTR lpCommandLine,
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ BOOL bInheritHandles,
_In_ DWORD dwCreationFlags,
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCTSTR lpCurrentDirectory,
_In_ LPSTARTUPINFO lpStartupInfo,
_Out_ LPPROCESS_INFORMATION lpProcessInformation
);
函數功能具體是干嘛的還請轉到MSDN查閱。我就說說最常用的參數。
1、最常用的參數還是
hToken
lpApplicationName
lpCommandLine
lpCurrentDirectory
lpProcessInformation
第一個hToken,是跟用戶相關的訪問令牌。 相當於認證一樣。
第二個參數lpApplicationName, 指的是你所創建進程文件的所在路徑包含文件名(最好帶着擴展名)
這里需要注意, 當路徑中包含空格,如C:\Program Files\MyProcess\App.exe 此時會按以下順序解析
c:\program.exe Files\MyProcess\App.exec:\program files\MyProcess\App.exe也就是說以 空格 會為分隔符(token)去創建進程(默認擴展名為exe),所以才會有 c:\program.exe。 如果這個目錄下恰好有一個名為program.exe文件,那么創建出來的進程就不是你想要的啦。所以當你的進程文件所在路徑有空格時最好用“”引用起來。如"C:\Program Files\MyProcess\App.exe".注意別把參數也放到引號中去。或者用windows api 把路徑轉換為短路徑(API名字百度一下就有了)。 第三個參數lpCommandLine,這里可以放你給被創建進程傳遞的參數。 注意 C程序在傳遞參數時需要在參數前加一個空格,因為c程序main函數入參默認第一個參數是模塊名稱,從第二個參數開始才是你想要傳遞進去的參數,而參數以空格分隔 所以你要加一個空格啦。(其實lpApplicationName為NULL時也可以用lpCommandLine來指定模塊文件的路徑和模塊名稱,具體參考MSDN)。有些進程主函數入參中就有 lpCommandLine參數,直接可以拿來用。有些進程需要調用GetCommandLine函數來獲取傳入的參數。 具體情況具體對待。 第九個參數lpCurrentDirectory,指的是進程運行的目錄(注意不是進程文件所在的目錄),為NULL時默認隨父進程。 第十一個參數lpProcessInformation,這個是個出參。 返回被創建進程的信息,包括進程PID等,具體參考LPPROCESS_INFORMATION結構體成員
