通过进程名称获取ID 再用ID获取句柄,
//通过进程ID获取进程句柄
HANDLE GetProcessHandleByID(int nID)
{
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);
}
//通过进程名(带后缀.exe)获取进程ID
DWORD GetProcessIDByName(CString pName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot) {
return NULL;
}
PROCESSENTRY32 pe = {
sizeof(pe) };
for (BOOL ret = Process32First(hSnapshot, &pe); ret; ret = Process32Next(hSnapshot, &pe))
{
CString sTemp = pe.szExeFile;
if (sTemp.CompareNoCase(pName) == 0)
{
CloseHandle(hSnapshot);
return pe.th32ProcessID;
}
}
CloseHandle(hSnapshot);
return 0;
}
// 获取exe命令行参数
void CmdLineToArr(LPTSTR lpCmdLine, CStringArray& saArgv)
{
CString strTemp, str;
strTemp = lpCmdLine;
strTemp.Trim();
int nPos = strTemp.Find(_T(' '));
while(nPos >= 0)
{
str = strTemp.Left(nPos+1);
str.TrimRight();
if(str.GetLength() > 0)
{
//如果参数的第一个字符是",那么向后找另一个",之间的是同一个参数
if(str[0] == _T('"'))
{
int nPos1 = strTemp.Find(_T('"'), 1);
if(nPos1 > 0)
{
nPos = nPos1;
str = strTemp.Left(nPos);
str = str.Mid(1);
}
}
saArgv.Add(str);
}
strTemp = strTemp.Mid(nPos+1);
nPos = strTemp.Find(_T(' '));
}
strTemp.Trim();
if(strTemp.GetLength() > 0)
{
if( (strTemp[0] == _T('"')) && (strTemp[strTemp.GetLength() - 1] == _T('"')) )
strTemp = strTemp.Mid(1, strTemp.GetLength()-2);
saArgv.Add(strTemp);
}
if(saArgv.GetSize() == 0)
return;
/*CString sModelFileName;
GetModuleFileName(AfxGetInstanceHandle(), sModelFileName.GetBuffer(MAX_PATH+1), MAX_PATH);
sModelFileName.ReleaseBuffer();
sModelFileName.Replace(_T('/'), _T('\\'));
if((nPos = sModelFileName.ReverseFind(_T('\\'))) > 0)
sModelFileName = sModelFileName.Mid(nPos + 1);
if(sModelFileName.Right(4).CompareNoCase(_T(".exe")) == 0)
sModelFileName = sModelFileName.Left(sModelFileName.GetLength() - 4);*/
CString sFirst = saArgv[0];
sFirst.Replace(_T('/'), _T('\\'));
if((nPos = sFirst.ReverseFind(_T('\\'))) > 0)
sFirst = sFirst.Mid(nPos + 1);
if(sFirst.Right(4).CompareNoCase(_T(".exe")) == 0)
/*sFirst = sFirst.Left(sFirst.GetLength() - 4);
if(sFirst.CompareNoCase(sModelFileName) == 0)*/
saArgv.RemoveAt(0);
}
………………………………………………………………………………
// CModelApp 初始化
BOOL CModelApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
// 创建互斥量,检查错误代码
HANDLE m_hMutex = CreateMutex(NULL, FALSE, _T("Model"));
DWORD nRet = GetLastError();
if (nRet == ERROR_ALREADY_EXISTS)
{
if(MessageBox(NULL,_T("Model程序正在后台运行,是否强制关闭?"), _T("提示"), MB_YESNO | MB_ICONQUESTION) == IDYES)
{
DWORD pId = GetProcessIDByName(_T("Model.exe"));
HANDLE hCurrent = GetProcessHandleByID(pId);
if (hCurrent != NULL)
{
// 强制结束进程
TerminateProcess(hCurrent, 0);
}
}
else
{
CloseHandle(m_hMutex);
m_hMutex = NULL;
return FALSE;
}
}
CWinApp::InitInstance();
AfxEnableControlContainer();
// 创建 shell 管理器,以防对话框包含
// 任何 shell 树视图控件或 shell 列表视图控件。
CShellManager *pShellManager = new CShellManager;
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
LPTSTR lpCmdLine = GetCommandLine();
CStringArray saArgs;
CmdLineToArr(lpCmdLine, saArgs);
CModelDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}
// 删除上面创建的 shell 管理器。
if (pShellManager != NULL)
{
delete pShellManager;
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}