多进程也是必备的操作。写一个实例程序。调用一个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)
{
//PID
lppi->dwPid = GetCurrentProcessId();
//Handle
lppi->hProcess=GetCurrentProcess();
//优先权
lppi->dwPrioClass=GetPriorityClass(hMySelf);
//句柄数量
lppi->dwHandleCount=GetProcessHandleCount(lppi->hProcess,&lppi->dwHandleCount);
//AffinityMask
GetProcessAffinityMask(hMySelf,&lppi->dwAffinityMask,NULL);
//WorkingSetSize
GetProcessWorkingSetSize(hMySelf,
&lppi->dwWorkingSetSizeMin,
&lppi->dwWorkingSetSizeMax);
lppi->szwCommandLine = GetCommandLineW();
//Start Up Info
GetStartupInfo(&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 si
si.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