VC 取得其他应用程序的路径

zhuweiping2003 2010-02-05 10:47:56
XP系统使用VC++ 6.0的情况下:
目的:为了防止同一路径下同一个应用程序的重复打开而造成的出错
实现:比如有一个应用程序 SamePathTest在某个路径,可以正常打开,然后再次打开时候便报错,提示已经打开。
但是:如果在别的路径也有该应用程序,要求正常打开。如果该程序存在多个不同的路径中,则都可以正常打开。
归根结底一句话:不同路径下的相同应用程序可以正常打开而不互相干扰,但是同一路径下同一个应用程序只能打开一次。

问题:
请问,如何判断取得其他路径已经打开的相同名称的应用程序的路径,必须考虑有多个的情况。

我目前已经解决的问题有:
取得自己的绝对路径 这步OK了
如下:


CString CSamePathTestDlg::GetMypath()
{
// TODO: Add your control notification handler code here

//用程序所在路径
CString m_FilePath;

GetModuleFileName(NULL,m_FilePath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);

m_FilePath.ReleaseBuffer();

int m_iPosIndex;

m_iPosIndex = m_FilePath.ReverseFind('\\');

m_FilePath = m_FilePath.Left(m_iPosIndex);

return m_FilePath+"\\SamePathTest.exe";

}


取得相同路径中是自己这个应用程序是否已经打开 这步已经OK了
请各位看下是否有问题。
如下:
在BOOL CSamePathTestDlg::OnInitDialog()中

BOOL CSamePathTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

//如果该程序已经运行,提示只允许运行一个该程序

cur_exe_path = GetMypath();

HANDLE hMutex;
hMutex= CreateMutex(NULL,TRUE, "SamePathTest.exe");
if(hMutex && GetLastError()==ERROR_ALREADY_EXISTS)
{
//请问:如果在已经找到了运行的SamePathTest.exe程序的HANDLE了
//怎么根据HANDLE找这些已经运行程序的绝对路径


//如有同一路径下则提示
AfxMessageBox("该程序已经运行!");
ReleaseMutex(hMutex);
exit(0);
}

return TRUE; // return TRUE unless you set the focus to a control
}



谢谢各位。
...全文
541 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuweiping2003 2010-02-09
  • 打赏
  • 举报
回复
谢谢各位 因为太忙了 一直没来结贴

祝各位新年快乐~
哈利路亚1874 2010-02-08
  • 打赏
  • 举报
回复
使用GetModuleFileName绝对没问题!
M_S_D_N 2010-02-05
  • 打赏
  • 举报
回复
楼主以文件名命名的Mutex都创建了,为啥就不创建个全路径名的Mutex?
数世纪 2010-02-05
  • 打赏
  • 举报
回复
互斥内核对象,或者findwindowex
wangk 2010-02-05
  • 打赏
  • 举报
回复
4#楼是最简单的方案。
hzy694358 2010-02-05
  • 打赏
  • 举报
回复
CreateMutex( NULL, TRUE, strFullFileName );

全路径,不错
bilaopao 2010-02-05
  • 打赏
  • 举报
回复
这么麻烦干嘛,直接Findwindow来找是不是已经打开程序了不就可以了。

或者通过创建互斥对象来做。
marrco2005 2010-02-05
  • 打赏
  • 举报
回复
你可以参考一下下面的代码
这是我在工程里面用的
其原理就是用 程序的绝对路径 为参数调用 CreateMutex



HRESULT CGlobalTool::CheckRunInSameDirectory( BOOL bExitIfExist )
{
CFilePath filepath;
CString strFullFileName = filepath.GetFullPathName();

strFullFileName.Replace( _T('\\'), _T('.') );

HANDLE hInstance = ::CreateMutex( NULL, TRUE, strFullFileName );
DWORD error = GetLastError();


if( bExitIfExist && error == ERROR_ALREADY_EXISTS)
{
CloseHandle(hInstance);
::MessageBox(NULL, _T("该程序已被打开! 禁止打开两个以上的相同目录下的程序!"), _T("提示"), MB_OK );
return E_FAIL;
}

return S_OK;

}


rollrock1987 2010-02-05
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1220
wltg2001 2010-02-05
  • 打赏
  • 举报
回复
用 CreateToolhelp32Snapshot枚举进程,通过Process32First,Process32Next对每个进程进行枚举,通过PROCESSENTRY32中的szExeFile得到进程的全路径
baoyz 2010-02-05
  • 打赏
  • 举报
回复
最简单的方法是ATOM。
每个程序用自己的绝对路径建立ATOM.
每个程序开启后先检查一下是否有相同的ATOM存在,就知道是否重复开启了。
magic7004 2010-02-05
  • 打赏
  • 举报
回复
1.EnumProcess获得进程Id
2.OpenProcesss 获得进程的handle
3.GetModuleFileNameEX 获取进程的Exe的路径
Eleven 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangk 的回复:]
你要注意要把\:这种字符压缩掉,或者替换成比如-之类可以接受的。
[/Quote]
right ,先把路径中的一些字符替换成指定的字符,然后再CreateMutex(),这样就可以了
wangk 2010-02-05
  • 打赏
  • 举报
回复
你要注意要把\:这种字符压缩掉,或者替换成比如-之类可以接受的。
zhuweiping2003 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 m_s_d_n 的回复:]
楼主以文件名命名的Mutex都创建了,为啥就不创建个全路径名的Mutex?
[/Quote]
创建全路径名的Mutex 该方法不成功

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧