码迷,mamicode.com
首页 > 编程语言 > 详细

VC++.单例1比较进程路径

时间:2020-05-15 19:52:27      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:rmi   other   bool   fir   命中   base   bug   ice   pid   

// ?.h : 头文件
#pragma once
#include <TlHelp32.h>
#include <vector>
#include <Psapi.h>

// ?.cpp
//#include <Psapi.h>
CString DosPathToNt(IN TCHAR *szDosPath)
{
	CString ret;
	try
	{
		TCHAR szDriver[MAX_PATH] = { 0 };
		TCHAR szTemp[3] = { 0 };
		TCHAR szDevName[MAX_PATH] = { 0 };
		INT iTemp = 0;
		if (!szDosPath)
		{
			return ret;
		}
		if (GetLogicalDriveStrings(MAX_PATH * sizeof(TCHAR), szDriver))
		{
			//c : \ \0
			//d : \ \0
			//...
			//\0 \0 \0 \0
			for (DWORD i = 0; szDriver[i]; i += 4)
			{
				//跳过盘符A:  B: 
				if (!lstrcmpi(&(szDriver[i]), _T("A:\\")) || !lstrcmpi(&(szDriver[i]), _T("B:\\")))
					continue;
				szTemp[0] = szDriver[i];
				szTemp[1] = szDriver[i + 1];
				szTemp[2] = _T(‘\0‘);
				if (QueryDosDevice(szTemp, szDevName, MAX_PATH * sizeof(TCHAR))) //查询 Dos 设备名
				{
					iTemp = lstrlen(szDevName);
					if (0 == _tcsnicmp(szDosPath, szDevName, lstrlen(szDevName))) //命中
					{
						ret = szTemp; //复制驱动器
						ret += (szDosPath + iTemp); //复制路径
					}
				}
			}
		}
		else
		{
			ret = szDosPath;
		}
	}
	catch (...)
	{
		OutputDebugStringA(__FUNCTION__);
	}
	return ret;
}
CString GetProcessPath(IN DWORD dwPid)
{
	CString ret;
	try
	{
		TCHAR szImagePath[MAX_PATH] = { 0 };
		HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPid);
		if (hProcess)
		{
			if (GetProcessImageFileName(hProcess, szImagePath, (MAX_PATH - 1) * sizeof(TCHAR)))
			{
				ret = DosPathToNt(szImagePath);
			}
			CloseHandle(hProcess);
		}
	}
	catch (...)
	{
		OutputDebugStringA(__FUNCTION__);
	}
	return ret;
}
//#include <TlHelp32.h>
//#include <vector>
BOOL TraversalProcess1(OUT std::vector<PROCESSENTRY32> &vec)
{
	/************************************************************************/
	/*
	typedef struct tagPROCESSENTRY32
	{
	DWORD   dwSize;
	DWORD   cntUsage;
	DWORD   th32ProcessID;          // this process
	ULONG_PTR th32DefaultHeapID;
	DWORD   th32ModuleID;           // associated exe
	DWORD   cntThreads;
	DWORD   th32ParentProcessID;    // this process‘s parent process
	LONG    pcPriClassBase;         // Base priority of process‘s threads
	DWORD   dwFlags;
	CHAR    szExeFile[MAX_PATH];    // Path 其实是进程名称
	} PROCESSENTRY32;
	*/
	/************************************************************************/
	vec.clear();
	try
	{
		HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
		if (hSnap != INVALID_HANDLE_VALUE)
		{
			PROCESSENTRY32 item;
			item.dwSize = sizeof(item);
			if (Process32First(hSnap, &item))
			{
				do
				{
					vec.push_back(item);
				} while (Process32Next(hSnap, &item));
			}
			CloseHandle(hSnap);
		}
	}
	catch (...)
	{
		OutputDebugStringA(__FUNCTION__);
		return 0;
	}
	return vec.size() > 0;
}
BOOL ?::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// 单例1:取本进程全路径,遍历所有进程取路径,逐个比较,命中则本进程退出。
	CString strCurPath = GetProcessPath(GetCurrentProcessId());
	std::vector<PROCESSENTRY32> vec;
	TraversalProcess1(vec);
	for each (PROCESSENTRY32 var in vec)
	{
		CString strOtherPath = GetProcessPath(var.th32ProcessID);
		if (strCurPath.CompareNoCase(strOtherPath) == 0 && GetCurrentProcessId() != var.th32ProcessID)
		{
			TerminateProcess(GetCurrentProcess(), 0);
		}
	}

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

VC++.单例1比较进程路径

标签:rmi   other   bool   fir   命中   base   bug   ice   pid   

原文地址:https://www.cnblogs.com/dailycode/p/12896490.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!