//創建進程,獲取進行相關信息,獲取啟動參數
#include
#include
DWORD CreateChildProcess(LPTSTR szChildProcessCmd);
int main(int argc, PCHAR argv[]){
CreateChildProcess(TEXT("6.2子進程.exe misakanumber 99999"));
return 0;
}
//參加子進程
DWORD CreateChildProcess(LPTSTR szChildProcessCmd){
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));//將啟動信息結構清零
si.cb = sizeof(si);//設置結構大小
ZeroMemory(&pi, sizeof(pi));//將進程信息結構清零
//創建子進程,判斷是否成功
if (!CreateProcess(
NULL,//使用命令行
szChildProcessCmd,//命令行
NULL,//不繼承進程句柄
NULL,//不繼承線程句柄
FALSE,//不繼承句柄
0,//沒有創建標志
NULL,//使用父進程環境變量
NULL,//使用父進程目錄作為當前目錄
&si,//啟動信息結構
&pi//進程信息結構
)){
printf("創建進程失敗: %d\n", GetLastError());
return 1;
}
//創建成功后,父進程也可以直接退出,這里等待子進程執行結束
//hProcess為子進程句柄
WaitForSingleObject(pi.hProcess, INFINITE);
//關閉進程句柄和現成句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
源碼
#include
#include
#define MyAlloc(size) HeapAlloc(GetProcessHeap(),0,size)
#define MyFree(lpMem) HeapFree(GetProcessHeap(),0,lpMem)
typedef struct _PROCESS_INFO{
DWORD dwPid;
HANDLE hProcess;
DWORD dwPrioClass;
DWORD dwHandleCount;
DWORD dwAffinityMask;
SIZE_T dwWorkingSetSizeMax;
SIZE_T dwWorkingSetSizeMin;
LPWSTR szwCommandLine;
STARTUPINFO sti;
}PROCESS_INFO,*LPPROCESS_INFO;
//全局變量
HANDLE hMySelf;
DWORD GetProcessInfo(LPPROCESS_INFO lppi);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow){
PROCESS_INFO pi;
INT argc;
WCHAR **argv;
INT i;
DWORD dwBufferSize = lstrlen(lpCmdLine) + MAX_PATH + 1024;
LPWSTR szShowBuffer = MyAlloc(dwBufferSize);
hMySelf = hInstance;
//顯示從WinMain函數參數得到的信息
wsprintf(szShowBuffer, TEXT("啟動參數:\n實例句柄: %.8X, 命令行參數: %s, 顯示選項: %.8X"), hInstance, lpCmdLine, nCmdShow);
MessageBox(NULL, szShowBuffer, TEXT("WinMain函數參數信息"), MB_OK);
//使用自定義函數獲取相關信息
GetProcessInfo(&pi);
//將命令行參數分離
argv = CommandLineToArgvW(pi.szwCommandLine, &argc);
//字符顯示
*szShowBuffer = (WCHAR)NULL;
for (i = 0; i< argc; i++){
DWORD dwBufferSize = lstrlenW(*argv) + 1;
LPSTR szMBAargv = MyAlloc(dwBufferSize);
WideCharToMultiByte(CP_ACP, 0,*argv, -1, szMBAargv, dwBufferSize, NULL, NULL);
argv++;
lstrcat(szShowBuffer, TEXT("\n"));
lstrcat(szShowBuffer, szMBAargv);
MyFree(szMBAargv);
}
MessageBoxW(NULL, szShowBuffer, TEXT("參數"), MB_OK);
MyFree(szShowBuffer);
//打印其他信息 TODO
return 0;
}
//獲取進程相關信息,保存到PROCESS_INFO結構中
DWORD GetProcessInfo(LPPROCESS_INFO lppi){
lppi->dwPid = (DWORD)GetCurrentProcessId;//PID
lppi->hProcess = GetCurrentProcess();//句柄
lppi->dwPrioClass = GetPriorityClass(hMySelf);//優先級
//句柄計數,xp sdk新增的API...無語,現在都win7了
//lppi->dwHandleCount = GetProcessHandleCount(lppi->hProcess, &lppi->dwHandleCount);
//AffinityMask
GetProcessAffinityMask(hMySelf, &lppi->dwAffinityMask, NULL);
//WorkingSetSize
GetProcessWorkingSetSize(hMySelf, &lppi->dwWorkingSetSizeMin, &lppi->dwWorkingSetSizeMax);
lppi->szwCommandLine = GetCommandLineW();
//啟動信息
GetStartupInfo(&lppi->sti);
return 0;
}