如何获得程序运行的次数 一个应用程序,如"myapp.exe",我同时运行了多次此程序,如何才能知道程序运行了多少次。请高手指教。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以程序每次启动的时候从文件(可以是INI文件也可以是文本文件)中读取一个整数,让这个整数+1,然后再把所得结果写回文件中!一个思路,希望对你有所帮助! to wqs_qiu_shi(美丽心情) and vcforever(霓裳羽衣) :是不是程序退出时再让这个值减一? 这样的话,要是程序非正常退出这个值就不对了。 运行多少,你只要在app的InitInstance里次数加一,把这个值写到注册表内就可以 对,我就想知道当前进程有多少个实例在运行。我主要是想保证任何时候只有进程的一个实例在运行。在应用程序类CEx1App::InitInstance()中,用CreateMutex函数创建一个互斥量,后调用函数GetLastError()如果结果等于ERROR_ALREADY_EXISTS说明已经有一个实例在运行了这时返回FALSE.handle=::CreateMutex(NULL,FALSE,one);//handle为声明的HANDLE类型的全局变量 if(GetLastError()==ERROR_ALREADY_EXISTS) { AfxMessageBox("应用程序已经在运行"); return FALSE; }} wqs_qiu_shi(美丽心情) 的方法好 wqs_qiu_shi(美丽心情) 的方法好使,另外,程序需不需要ReleaseMutex(handle)?? 回复人: wwhxxx() ( ) 信誉:100 2004-06-24 11:02:00 得分: 0 wqs_qiu_shi(美丽心情) 的方法好使,另外,程序需不需要ReleaseMutex(handle)?? =================当然要在最后的时候释放了. 使用ATOM在MSDN中查看GlboalAddAtomGlobalFindAtomGlobalDeleteAtom你就知道怎么用了 方法很多,好像上面的方面都可以,不过用mutex方法是最常见的一种 呵呵,如果指定一个程序可以有不超过n个实例的情况下CreateMutex就不好使了吧。另外,请问zhaolaoxin() 你是怎么混到两颗星的?-----------------------------------------------------------------------zhaolaoxin() 在程序里放一个静态变量,程序运行时将该变量加一,就可以做一些判断了----------------------------------------------------------------------- 最简单方便的办法就是使用dll,在里面定义一个int型每进入一次+1,退出一次-1由于dll由所有同类程序共享,故而随时可以得知当前实例数量 我也想知道,在用mutex方法时,如果程序非法退出,是不是还有效? 请问NicolasChen(树梢上的风)一个执行文件被运行多份实例不也是共享吗?干嘛还要拐个弯用dll。估计你和zhaolaoxin()都是一个意思吧,用个全局变量来统计运行的实例数吧,但是你们都好像少了个前提条件吧,就是这个变量必须在一个共享段中。 建立共享内存文件当然是好办法。也有其它很多方法。如果程序的名字一样的话,建立一个全局共享变量计数器便可,但程序非法退出记数器未进行减运算就不准了。也可以每当程序运行时遍历系统进程,通过进程句柄得到其进程程序的文件名,(若不想麻烦就直接比较文件名是否相等)再对文件进行CRC效验,CRC效验值和自身文件的CRC效验值相同的大致就是自己程序的一个进程,Number++,直到进程遍历完。当然方法很多。好运! //将以下代码加入到App的InitInstance函数内,能实现你的只允许一个实例在运行 HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszAppName); if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hSem); HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(),GW_CHILD); while (::IsWindow(hWndPrevious)) { if (::GetProp(hWndPrevious, m_pszExeName)) { if (::IsIconic(hWndPrevious)) ::ShowWindow(hWndPrevious,SW_RESTORE); ::SetForegroundWindow(hWndPrevious); ::SetForegroundWindow( ::GetLastActivePopup(hWndPrevious)); return FALSE; } hWndPrevious = ::GetWindow(hWndPrevious,GW_HWNDNEXT); } return FALSE; } ablewindy(我是【风子】我怕谁) 的方法有个问题:要是我改了可执行文件的文件名,程序就能又运行了!!另外,if (::GetProp(hWndPrevious, m_pszExeName)) 好像永远都是false 将下面代码加到app的InitInstance函数前CString g_strProName = _T("SMS APPLICATION");HANDLE g_hValue = (HANDLE)1;BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM lParam){ HANDLE h = GetProp(hWnd, g_strProName); if(h == g_hValue) { *(HWND*)lParam = hWnd; return FALSE; } else { return TRUE; }}在app的InitInstance函数内加 HWND oldHWnd = NULL; EnumWindows(EnumWndProc, (LPARAM)&oldHWnd); if(oldHWnd != NULL) {// AfxMessageBox(_T("hello")); ShowWindow(oldHWnd, SW_SHOWNORMAL); SetForegroundWindow(oldHWnd); return FALSE; } else { } 谁懂怎么释放资源。。。。 怎样用代码修改dialog的style属性? 问个关于查询USB信息的问题,简单,但是我是初学者,只能再次问问 为什么classview中添加的新类在ClassWinzard中没有呢 如何查询SQLITE 状态 如何阅读一个基于COM的超大系统的源码 如何编写代码封MAC地址? 怎样可以控制其他EXE程序运行关闭及显示隐藏???? 寻求tsp问题的解法? 200分求网管软件源程序。 调查一下程序员的健康状况!!!!!兄弟们都进来关心一下自己!!!! 编译问题,两个文件能在别的工程中正确编译,却不能在我的工程中编译
是不是程序退出时再让这个值减一? 这样的话,要是程序非正常退出这个值就不对了。
我主要是想保证任何时候只有进程的一个实例在运行。
在应用程序类CEx1App::InitInstance()中,用CreateMutex函数创建一个互斥量,后调用函数GetLastError()
如果结果等于ERROR_ALREADY_EXISTS说明已经有一个实例在运行了这时返回FALSE.handle=::CreateMutex(NULL,FALSE,one);//handle为声明的HANDLE类型的全局变量
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
AfxMessageBox("应用程序已经在运行");
return FALSE;
}
}
另外,程序需不需要ReleaseMutex(handle)??
wqs_qiu_shi(美丽心情) 的方法好使,
另外,程序需不需要ReleaseMutex(handle)??
=================
当然要在最后的时候释放了.
在MSDN中查看
GlboalAddAtom
GlobalFindAtom
GlobalDeleteAtom
你就知道怎么用了
不过用mutex方法是最常见的一种
另外,请问zhaolaoxin() 你是怎么混到两颗星的?-----------------------------------------------------------------------
zhaolaoxin()
在程序里放一个静态变量,程序运行时将该变量加一,就可以做一些判断了
-----------------------------------------------------------------------
每进入一次+1,退出一次-1
由于dll由所有同类程序共享,故而随时可以得知当前实例数量
也有其它很多方法。
如果程序的名字一样的话,建立一个全局共享变量计数器便可,但程序非法退出记数器未进行减运算就不准了。
也可以每当程序运行时遍历系统进程,通过进程句柄得到其进程程序的文件名,
(若不想麻烦就直接比较文件名是否相等)
再对文件进行CRC效验,CRC效验值和自身文件的CRC效验值相同的大致就是自己程序的一个进程,Number++,直到进程遍历完。
当然方法很多。好运!
{
CloseHandle(hSem);
HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(),GW_CHILD);
while (::IsWindow(hWndPrevious))
{
if (::GetProp(hWndPrevious, m_pszExeName))
{
if (::IsIconic(hWndPrevious))
::ShowWindow(hWndPrevious,SW_RESTORE);
::SetForegroundWindow(hWndPrevious); ::SetForegroundWindow(
::GetLastActivePopup(hWndPrevious)); return FALSE;
}
hWndPrevious = ::GetWindow(hWndPrevious,GW_HWNDNEXT);
}
return FALSE;
}
要是我改了可执行文件的文件名,程序就能又运行了!!
另外,if (::GetProp(hWndPrevious, m_pszExeName)) 好像永远都是false
CString g_strProName = _T("SMS APPLICATION");
HANDLE g_hValue = (HANDLE)1;BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM lParam)
{
HANDLE h = GetProp(hWnd, g_strProName);
if(h == g_hValue)
{
*(HWND*)lParam = hWnd; return FALSE;
}
else
{
return TRUE;
}}在app的InitInstance函数内加
HWND oldHWnd = NULL; EnumWindows(EnumWndProc, (LPARAM)&oldHWnd);
if(oldHWnd != NULL)
{
// AfxMessageBox(_T("hello"));
ShowWindow(oldHWnd, SW_SHOWNORMAL);
SetForegroundWindow(oldHWnd); return FALSE;
}
else
{
}