您的位置:首页 > 其它

Window API (六)多进程的操作

2011-12-19 14:12 260 查看
多进程也是必备的操作。写一个实例程序。调用一个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");
}


直接运行子进程:



运行父进程:







本篇博客出自
阿修罗道,转载请注明出处:/article/1505651.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: