目前听说有两种方法:
1、程序运行时创建一个信号量,判断信号量是否已创建
2、通过 WinMain函数的 hPrevInstance参数 判断
问题:
1、如果采用方法2,在MFC中有什么方法可以读取到WinMain的hPrevInstance参数的值?
2、还有没有更好更简便的方法?

解决方案 »

  1.   

    1. hPrevInstance没用
    2. 用Mutex
      

  2.   

    HANDLE Handle = CreateMutex( NULL, FALSE , _T("ONLY_ONE_CLIENT"));

    if(Handle == NULL)
    {
    // 创建 Mutex 出错,
    }else

    if (ERROR_ALREADY_EXISTS == GetLastError())
    {
    AfxMessageBox("已有一个实例在运行,不允许同时打开多个!");
    return FALSE;
    }
    }
      

  3.   

    用你的第一种方法吧,LS的不错在16位的Windows中,如果您启动正在执行的程序的一个新执行实体,WinMain的hPrevInstance参数将是前一个执行实体的执行实体句柄。为节省内存,两个或多个执行实体就可能会共享相同的窗口类别。这样,窗口类别就只在hPrevInstance是NULL的时候才注册,这表明程序没有其它执行实体。在32位的Windows中,hPrevInstance总是NULL。此程序代码会正常执行,而实际上也没必要检查hPrevInstance。
      

  4.   

    只能用方法1了。2、通过 WinMain函数的 hPrevInstance参数 判断
    hPrevInstance这个参数没用。
      

  5.   

    方法一:利用互斥对象实现线程同步(CreateMute函数).
    方法二:利用事件对象实现线程同步(CreateEvent函数).
    这两种方法都能实现只有一个实例运行,创建一个非匿名对象,然后判断GetLastError()返回值就可以知道这个对象是以前有的,还是新创建的。
    上百度查查相关函数,就能找到用法了。
      

  6.   

    创建一个新的节
    #pragma  data_seg("Shared")
    int volatile g_lAppInstance =0;
    #pragma  data_seg()#pragma comment(linker,"/section:Shared,RWS")
      

  7.   

    最简单的方法就是上面说的
    创建一个有名字的全局内核对象
    如MFC里的CMutex,就最快