最近在网站找了两个函数关闭进程和创建进程的功能,如下:
#include <Windows.h>
int KillProcess(LPCTSTR pszClassName, LPCTSTR pszWindowTitle)
{
HANDLE hProcessHandle;
ULONG nProcessID;
HWND TheWindow;
TheWindow = ::FindWindow( NULL, pszWindowTitle);
::GetWindowThreadProcessId( TheWindow, &nProcessID );
hProcessHandle = ::OpenProcess( PROCESS_TERMINATE, FALSE,
nProcessID );
return ::TerminateProcess( hProcessHandle, 4 );
}
int CreateNewProcess(LPWSTR pszExeName)
{
PROCESS_INFORMATION piProcInfoGPS;
STARTUPINFO siStartupInfo;
SECURITY_ATTRIBUTES saProcess, saThread;
ZeroMemory( &siStartupInfo, sizeof(siStartupInfo) );
siStartupInfo.cb = sizeof(siStartupInfo);
saProcess.nLength = sizeof(saProcess);
saProcess.lpSecurityDescriptor = NULL;
saProcess.bInheritHandle = true;
saThread.nLength = sizeof(saThread);
saThread.lpSecurityDescriptor = NULL;
saThread.bInheritHandle = true;
TCHAR szCommandLine[256] = {0};
memcpy(szCommandLine,pszExeName,wcslen(pszExeName)*2);
return ::CreateProcess( NULL, szCommandLine, &saProcess,
&saThread, false,
CREATE_DEFAULT_ERROR_MODE, NULL, NULL,
&siStartupInfo,
&piProcInfoGPS );
}
一开始函数是这样写的:
CreateProcess( NULL, pszExeName, &saProcess,
&saThread, false,
CREATE_DEFAULT_ERROR_MODE, NULL, NULL,
&siStartupInfo,
&piProcInfoGPS );
执行CreateProcess的时候程序会飞掉,报什么c0005的错误,找了好久才看到网上的一片文章,原因如下:
“CreateProcess内部会更改向其传递的命令行字符串,但在CreateProcess返回之前,它会将该字符串恢复原样。这一点是非常重要的,因为如果你向CreateProcess传递的命令行字符串位于进程的只读存储区,就会发生Access Violation错误。