//創(chuàng)建進(jìn)程,獲取進(jìn)行相關(guān)信息,獲取啟動參數(shù)
#include
#include
DWORD CreateChildProcess(LPTSTR szChildProcessCmd);
int main(int argc, PCHAR argv[]){
CreateChildProcess(TEXT("6.2子進(jìn)程.exe misakanumber 99999"));
return 0;
}
//參加子進(jìn)程
DWORD CreateChildProcess(LPTSTR szChildProcessCmd){
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));//將啟動信息結(jié)構(gòu)清零
si.cb = sizeof(si);//設(shè)置結(jié)構(gòu)大小
ZeroMemory(&pi, sizeof(pi));//將進(jìn)程信息結(jié)構(gòu)清零
//創(chuàng)建子進(jìn)程,判斷是否成功
if (!CreateProcess(
NULL,//使用命令行
szChildProcessCmd,//命令行
NULL,//不繼承進(jìn)程句柄
NULL,//不繼承線程句柄
FALSE,//不繼承句柄
0,//沒有創(chuàng)建標(biāo)志
NULL,//使用父進(jìn)程環(huán)境變量
NULL,//使用父進(jìn)程目錄作為當(dāng)前目錄
&si,//啟動信息結(jié)構(gòu)
&pi//進(jìn)程信息結(jié)構(gòu)
)){
printf("創(chuàng)建進(jìn)程失敗: %d\n", GetLastError());
return 1;
}
//創(chuàng)建成功后,父進(jìn)程也可以直接退出,這里等待子進(jìn)程執(zhí)行結(jié)束
//hProcess為子進(jìn)程句柄
WaitForSingleObject(pi.hProcess, INFINITE);
//關(guān)閉進(jìn)程句柄和現(xiàn)成句柄
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函數(shù)參數(shù)得到的信息
wsprintf(szShowBuffer, TEXT("啟動參數(shù):\n實例句柄: %.8X, 命令行參數(shù): %s, 顯示選項: %.8X"), hInstance, lpCmdLine, nCmdShow);
MessageBox(NULL, szShowBuffer, TEXT("WinMain函數(shù)參數(shù)信息"), MB_OK);
//使用自定義函數(shù)獲取相關(guān)信息
GetProcessInfo(&pi);
//將命令行參數(shù)分離
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("參數(shù)"), MB_OK);
MyFree(szShowBuffer);
//打印其他信息 TODO
return 0;
}
//獲取進(jìn)程相關(guān)信息,保存到PROCESS_INFO結(jié)構(gòu)中
DWORD GetProcessInfo(LPPROCESS_INFO lppi){
lppi->dwPid = (DWORD)GetCurrentProcessId;//PID
lppi->hProcess = GetCurrentProcess();//句柄
lppi->dwPrioClass = GetPriorityClass(hMySelf);//優(yōu)先級
//句柄計數(shù),xp sdk新增的API...無語,現(xiàn)在都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;
}