怎样使应用程序只执行一次?

qwedcxza 2002-02-03 07:46:29

并且这个功能在应用程序自身来实现.


谢谢!
...全文
193 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiaohan 2002-02-04
  • 打赏
  • 举报
回复
12. 如何利用多进程对共享内核对象的访问来防止一个应用程序启动多次?
举例说明:
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HANDLE hNew = NULL;
DWORD dwErrCode = 0;

hNew = CreateMutex( NULL, FALSE, "{FA123-DKJKL-43443-643FJD3}" );
if ( hNew == NULL )
{
return 0;
}
dwErrCode = GetLastError( );
if ( dwErrCode == ERROR_ALREADY_EXISTS )
{
CloseHandle( hNew );
return 0;
}
// This is the first instance of this application running.
……
……
……
// Before exiting, close the object.
CloseHandle( hNew );
return 0;
}
hongzhh 2002-02-04
  • 打赏
  • 举报
回复
BOOL ***App::InitInstance()
{

CreateMutex(NULL,TRUE,AfxGetAppName());
if(GetLastError()==ERROR_ALREADY_EXISTS)
{
MessageBox(NULL,"***App已经运行。","XXXX",MB_OK|MB_ICONWARNING);
return FALSE;
}
}
gstan 2002-02-04
  • 打赏
  • 举报
回复
if(::FindWindow("你程序的标题名称"))
return;



把这一句放到CWinApp的初始化函数的最前面.
linjiework 2002-02-04
  • 打赏
  • 举报
回复
下面是《程序员》杂志介绍过的两种方法:


/*
* RunAlready_Atom.c : 保证程序只被运行一次。
*
* 时间:2001.07.13.
*
* 来源:《程序员》 2001.7
*
* 说明:程序运行结束后,应该调用 GlobalDeleteAtom(MyAtom) ,
* 在本程序中就是调用 RunAlreadyDel()
* 删除增加的原子。
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#include <windows.h>

static ATOM MyAtom=0;

bool RunAlready( char *MyAtomStr )
{
MyAtom = GlobalFindAtom( MyAtomStr );
if( MyAtom != 0 )
return true; // 找到,表示程序已经运行。
MyAtom = GlobalAddAtom( MyAtomStr ); // 没有找到,加入新的全局原子。
return false; // 程序没有运行。
}

void RunAlreadyDel( void )
{
GlobalDeleteAtom(MyAtom);
}


/*
* RunAlready_Mutex.c : 保证程序只被运行一次。
*
* 时间:2001.07.13.
*
* 来源:《程序员》 2001.7
*
* 说明:程序运行结束后,应该调用 GlobalDeleteAtom(hMutex) ,
* 在本程序中就是调用 RunAlreadyDel()
* 删除增加的原子。
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#include <windows.h>

static HANDLE hMutex=NULL;

bool RunAlready( char *MutexObj )
{
hMutex = CreateMutex(false,false,MutexObj);
if( hMutex != NULL ) // 创建成功。
{
DWORD err=GetLastError();
if( err == ERROR_ALREADY_EXISTS )
return true; // 程序已经运行。
return false; // 第一次创建,程序没有运行过。
}
// 创建失败,无法确定的结果。返回值可以由程序员自己定。
return false;
}

void RunAlreadyDel( void )
{
ReleaseMutex(hMutex);
}


dct1999 2002-02-04
  • 打赏
  • 举报
回复
同意楼上的
yleng 2002-02-03
  • 打赏
  • 举报
回复
povety(wood) 的可行,我同意。
thb 2002-02-03
  • 打赏
  • 举报
回复
在InitInstance()中:

LPCTSTR StartStatus="NetClient_2";
if(OpenMutex(MUTEX_ALL_ACCESS,FALSE,StartStatus)!=NULL)
return FALSE;
povety 2002-02-03
  • 打赏
  • 举报
回复
程序初始化时建立一个CMutex的实例,起一个唯一的名字
在initinstance里判断其是否已存在,存在则return false;否则就继续
ahphone 2002-02-03
  • 打赏
  • 举报
回复
上面的是个办法。
我见过有人寻找窗口标题,然后判断是否启动自身。
程序员杂志的2001第7期里提到用原子的方法来使应用程序只执行一次,那是一个非常棒的方法。
linjiework 2002-02-03
  • 打赏
  • 举报
回复
向注册表里隐蔽的地方写一个标志位。
更绝的就是运行这个程序后,把应用程序删除。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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