6.1創(chuàng)建進(jìn)程6.2子進(jìn)程 [編碼問題]

//創(chuàng)建進(jìn)程,獲取進(jìn)行相關(guān)信息,獲取啟動(dòng)參數(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));//將啟動(dòng)信息結(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,//啟動(dòng)信息結(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("啟動(dòng)參數(shù):\n實(shí)例句柄: %.8X, 命令行參數(shù): %s, 顯示選項(xiàng): %.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)先級(jí)

//句柄計(jì)數(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();

//啟動(dòng)信息

GetStartupInfo(&lppi->sti);

return 0;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 說明 第一個(gè)程序是服務(wù),第二個(gè)程序控制服務(wù) 好像需要管理員權(quán)限,不然啟動(dòng)失敗.. 效果 服務(wù)程序 名字是 MiSa...
    f675b1a02698閱讀 719評(píng)論 0 0
  • 說明 第一次參數(shù) -a 創(chuàng)建一個(gè)10頁大小的堆,所以在分配堆時(shí)出錯(cuò)直接退出,沒有銷毀堆? 第二次沒有參數(shù),說明創(chuàng)建...
    f675b1a02698閱讀 558評(píng)論 0 0
  • #include void ScrollScreenBuffer(HANDLE, INT);//??? VOID ...
    f675b1a02698閱讀 805評(píng)論 0 0
  • ## 可重入函數(shù) ### 可重入性的理解 若一個(gè)程序或子程序可以安全的被并行執(zhí)行,則稱其為可重入的;即當(dāng)該子程序正...
    夏至亦韻閱讀 808評(píng)論 0 0
  • 七夕lyh 最憐人間落單人,孤守乾坤兩處愁 倚窗空羨鵲橋仙,漫緒閑數(shù)相思豆 我最不愿夢(mèng)見的人,是你,最不愿夢(mèng)見的場(chǎng)...
    群玉秉輝閱讀 179評(píng)論 0 1

友情鏈接更多精彩內(nèi)容