C++-如何判断两个实例是否一个程序

C++-如何判断两个实例是否一个程序

想挽留 发布于 2017-08-06 字数 113 浏览 1173 回复 3

比如有a.exe在c:/a.exe和e:/a.exe中两份copy, 当都点击运行的时候, 我用程序如何判断出,这是一个程序的不同实例?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

瑾兮 2017-10-24 3 楼

可以建立一个共享的数据段,里面保留足够的空间。程序启动后,要把自身的ProcessId放到该段中。其它实例启动的时候,扫描该段,就可以知道哪些进程是本程序的实例之一了。

代码如下:

/ 建立一个数据段
#pragma data_seg("new_data_sec")
DWORD dwProcessIds[1024]={0}; // 保留1024个位置,用于存储ProcessId
#pragma data_seg()
// 将这个数据段设置为共享段……
#pragma comment(linker, "/section:new_data_sec,RWS")

……
……

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
……
for(int i=0;i<1024;i++)
{
if(dwProcessIds[i] != 0)// 打印出已有的id
{
printf("Instance No.%d:0x%08x", i, dwProcessIds[i]);
}
else // 找到一个空白,把自己的ID加入到共享段中……
{
dwProcessIds[i] = GetCurrentProcessId();
break;
}
}
// 继续其它语句
}

想挽留 2017-10-06 2 楼

拿到进程对应的模块路径 比较文件是否相同
不知还有什么别的办法

想挽留 2017-08-11 1 楼

可以比较程序的版本号,以下是获得程序版本信息的函数

CString GetProductVersion(LPCTSTR lpszFileName)
/*========================================================================
功能: 获取文件版本信息.
说明: 要使用此函数必需在程序中加入

#pragma comment(lib, "Version.lib")

参数: lpszFileName = 程序文件名,如果为空则是获取当前运行程序的版本信息
==========================================================================*/
{
CString strVersion;
TCHAR szSrcfn[MAX_PATH]; // 要获取信息的文件
if(lpszFileName == NULL)
::GetModuleFileName(NULL, szSrcfn, sizeof(szSrcfn));
else
lstrcpy(szSrcfn, lpszFileName);

// 读文件信息
DWORD dwVerHnd = 0;
DWORD dwVerInfoSize = ::GetFileVersionInfoSize(szSrcfn, &dwVerHnd);
if(dwVerInfoSize)
{
// If we were able to get the information, process it:
HANDLE hMem;
LPVOID lpvMem;
unsigned int uInfoSize = 0;
VS_FIXEDFILEINFO * pFileInfo;

hMem = ::GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
lpvMem = ::GlobalLock(hMem);
::GetFileVersionInfo(szSrcfn, dwVerHnd, dwVerInfoSize, lpvMem);
::VerQueryValue(lpvMem, (LPTSTR)_T(""), (void**)&pFileInfo, &uInfoSize);

WORD nVer[4];
nVer[0] = HIWORD(pFileInfo->dwProductVersionMS);
nVer[1] = LOWORD(pFileInfo->dwProductVersionMS);
nVer[2] = HIWORD(pFileInfo->dwProductVersionLS);
nVer[3] = LOWORD(pFileInfo->dwProductVersionLS);
strVersion.Format(_T("%d.%d.%d.%d"), nVer[0], nVer[1],nVer[2],nVer[3]);

::GlobalUnlock(hMem);
::GlobalFree(hMem);
}

return strVersion;
}