用互斥(Mutex),Mutex本来是多线程同步用的,防止 
多个线程访问同一资源而引发冲突。用CreateMutex可以 
创建Mutex对象,实质上是一个kernel对象。 在任何Win32程序(包括GDI和Console)的启动部分加上 
以下代码(Console程序的main函数、MFC程序的CWinApp 
派生类的InitInstance成员函数、RawSDK程序的WinMain 
函数): 
hMutex=CreateMutex( 
NULL,//nosecurityattributes 
FALSE,//initiallynotowned 
"RunOnlyOneInstance");//命名Mutex是全局对象 
//在所有的process都可以访问到 if(hMutex==NULL|| 
ERROR_ALREADY_EXISTS==::GetLastError()){ 
//程序第二次或以后运行时,会得到Mutex已经创建的错误 
returnFALSE; 

嘿嘿,是不是不用FindWindow优雅简洁多了? 另外,如果要限定程序同时可运行n个实例怎么办? 
Tips:用信号量(Semaphore)
用的是C语言,你看着改写一下。

解决方案 »

  1.   

    其实在VB里不用这么复杂,如下代码即可:Option ExplicitPrivate Sub Form_Load()
        
        ' 判断程序是否启动多个实例
        If App.PrevInstance = True Then
            MsgBox "你的程序已经启动过了!", vbInformation Or vbOKOnly, "提示..."
            ' 退出多余实例
            Unload Me
            ' 此句不能少
            Exit Sub
        End If
        
        '//...........
        '//你的主程序
        '//...........
        
    End Sub
      

  2.   

    我早就说了用 App.PrevInstance = True 的办法不能达到我的目的。
    用CreateMutex怎样释放互斥体对象的句柄啊
    我在程序中用 CloseHandle hMutex 后,下次总是判断出
    Err.LastDllError = ERROR_ALREADY_EXISTS
    怎么回事,还有其它办法吗?
      

  3.   

    除了运用互斥体对象的方法以外,你还可以用在文件或者注册表做标记的方法,也可以使用FindWindow的方法,但都不保险,做标记的方法在程序意外出错的时候将会出现错误的结果,FindWindow当有其他程序有同名的Caption时也回出现意外的结果。