Window API (六)多进程的操作

来源:互联网 发布:淘宝上的柠檬好吗 编辑:程序博客网 时间:2024/05/21 09:30

     多进程也是必备的操作。写一个实例程序。调用一个Child.exe的可执行程序作为子进程。要先将Child.exe编译好放在同一目录下。

//Child.cpp#include<stdio.h>#include<windows.h>#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){//PIDlppi->dwPid = GetCurrentProcessId();//Handlelppi->hProcess=GetCurrentProcess();//优先权lppi->dwPrioClass=GetPriorityClass(hMySelf);//句柄数量lppi->dwHandleCount=GetProcessHandleCount(lppi->hProcess,&lppi->dwHandleCount);//AffinityMaskGetProcessAffinityMask(hMySelf,&lppi->dwAffinityMask,NULL);//WorkingSetSizeGetProcessWorkingSetSize(hMySelf,&lppi->dwWorkingSetSizeMin,&lppi->dwWorkingSetSizeMax);lppi->szwCommandLine = GetCommandLineW();//Start Up InfoGetStartupInfo(&lppi->sti);return 0;}int  APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){PROCESS_INFO pi;INT argc;WCHAR **argv;INT i;DWORD dwBufferSize = lstrlen(lpCmdLine)+MAX_PATH +1024;LPSTR szShowBuffer = (LPSTR)MyAlloc(dwBufferSize);hMySelf=hInstance;wsprintf(szShowBuffer,"启动参数\n实例句柄:%.8x,命令行参数: %s,显示选项:%.8x",hInstance,lpCmdLine,nCmdShow);MessageBox(NULL,szShowBuffer,"WinMain 函数参数",MB_OK);GetProcessInfo(&pi);//不支持汉字转化argv = CommandLineToArgvW(pi.szwCommandLine,&argc);*szShowBuffer = NULL;for(i=0;i<argc;i++){DWORD dwBufferSize =lstrlenW(*argv)+10;LPSTR szMBArgv= (LPSTR)MyAlloc(dwBufferSize);WideCharToMultiByte(CP_ACP,NULL,*argv,-1,szMBArgv,dwBufferSize,NULL,NULL);argv++;lstrcat(szShowBuffer,"\n");lstrcat(szShowBuffer,szMBArgv);MyFree(szMBArgv);}MessageBox(NULL,szShowBuffer,"参数",MB_OK);MyFree(szShowBuffer);return 0;}


 然后是父进程的程序:

#include<stdio.h>#include<windows.h>DWORD CreateChildProcess(LPSTR szChildProcessCmd){STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si,sizeof(si));//Set the size of sisi.cb =sizeof(si);ZeroMemory(&pi,sizeof(pi));if(!CreateProcess(NULL,szChildProcessCmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)){printf("CreateProcess failed(%d).\n",GetLastError());return 1;}WaitForSingleObject(pi.hProcess,INFINITE);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return 0;}int main(){CreateChildProcess("Child.exe fsy 2011-12-19 as Gamer");}


直接运行子进程:

运行父进程:

 

 

       本篇博客出自  阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/7083968

 

 

 

原创粉丝点击