就是应用程序启动一个后,防止这个程序再次被启动?怎么做呢?

解决方案 »

  1.   

    程序只运行一个实例,并激活前一个实例http://www.vckbase.com/document/viewdoc.asp?id=672
      

  2.   

    在   XXXXApp::InitInstance()里加入:
        HANDLE m_hMutex=CreateMutex(NULL,TRUE, m_pszAppName); 
        if(GetLastError()==ERROR_ALREADY_EXISTS) { return FALSE; }
      

  3.   

    http://www.vckbase.com/document/listdoc.asp?mclsid=13&sclsid=1305
      

  4.   

    我总结了以下3种方法,第四种还没有完成,你参考参考吧:
    1. 使用命名互斥对象:(其实质是创建一个仅能运行一次的以字符串命名的系统级变量)
    HANDLE hObject;
    int CMessageSendApp::ExitInstance() 
    {
    hObject =::CreateMutex(NULL,FALSE, "one");
    if(GetLastError()==ERROR_ALREADY_EXISTS)
    {
    CloseHandle(hObject);
    AfxMessageBox("应用程序已经在运行");
    return FALSE;
    }
    }int CMessageSendApp::ExitInstance() 
    {
    CloseHandle(hObject);
    return CWinApp::ExitInstance();
    }
    2. 进程间发送消息:
    UINT wm_die;
    InitInstance()中:
    HWND hWnd = m_pMainWnd->m_hWnd;
    wm_die = ::RegisterWindowMessage ("WM_DIE");
    ::PostMessage(HWND_BROADCAST, wm_die, (WPARAM)(hWnd), 0);
    PreTranslateMessage()中:
    if(pMsg->message == wm_die)
    {
    if((HWND)(pMsg->wParam) != m_pMainWnd->m_hWnd)
    {
    AfxMessageBox("不能有两个程序实例同时运行", MB_OK, 0);
    ::SendMessage((HWND)(pMsg->wParam), WM_SYSCOMMAND, SC_CLOSE, 0);
    }
    }
    说明:如果是同一个进程,那么参数wParam和当前的主窗口句柄m_pMainWnd->m_hWnd相同。3. 用一个系统级全局变量:
    在.cpp文件开头加上以下几行: 
    #pragma data_seg("Shared")     
    int volatile g_lAppInstance =0;
    #pragma data_seg()我们来看一下上面的内容:
    第一句 #pragma data_seg("Shared") 创建一个称为Shared 的新节。
    第二句 int volatile g_lAppInstance =0 将 g_lAppInstance 放入Shared节中。注意此时只有将g_lAppInstance初始化,编译器才会将其放入Shared节中,否则,将放入Shared以外的节。(实际上Visual C++ 编译器提供了一个allocate 说明符,使我们可以将数据放到任何节中。)
    第三句指示编译器Shared 节结束。 
    #pragma comment(linker,"/section:Shared,RWS")
    这一句,我们使编译链接器知道我们的Shared节具有读,写,共享的属性。这是我们实现互斥运行的关键。这样我们就可以在应用程序之间的多个实例之间共享g_lAppInstance 变量。要注意section:后面必须和data_seg("Shared")引号里的名字一样。
    在InitInstance() 函数中加入: 
    if(++g_lAppInstance>1)
    {
    AfxMessageBox("程序已经运行!");
    return FALSE;
    }
    以上代码的作用是在程序是开始对g_lAppInstancd 加1 ,如果发现其值大于1,那么显示Message Box ,并返回FALSE。(注意:在MFC中如果InitInstance返回FALSE,程序将不会被运行!)4. 用信号灯
      

  5.   

    zhang_dq(虾米) 这位高人的办法比较简单