为什么MSN只能启动一个实例?该怎么解决

为什么MSN只能启动一个实例?
请问各位,微软是如何做到这一点的?

------解决方案--------------------
So easy.
最简单的,
程序启动的时候去检测一个命名的内核对象是否已经存在.
如果存在,则不表示已经有一个程序启动了.当前进程退出.
否则,创建这个对象.正常运行.
------解决方案--------------------
太简单了嘛。。。。

//Single
HANDLE hSingle = CreateEvent(NULL, FALSE, FALSE, "Server.NetbarPro ");
DWORD dwErr = GetLastError();
if(ERROR_ALREADY_EXISTS == dwErr)
{
return FALSE;
}
//.

代码放到app里::InitInstance()
------解决方案--------------------
不是这么简单,你如果只想知道是不是有另外一个Instance在执行当然容易,不过如果好的UI应该是启动第二个的时候自动把前一个拿到ForegroundWindow,比如MSN,在最小化(Iconize)的时候可以自动恢复窗口。

比较流行的方法是用File Mapping,这里面有解释:

http://www.codeproject.com/threads/simplesingleinstanceapp.asp

我以前用过这个,注意你的Message Map一定要Hook到这个上,VS缺省是:

BEGIN_MESSAGE_MAP(CBaywireApp, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()

把它改成

BEGIN_MESSAGE_MAP(CBaywireApp, CSingleInstanceApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()

否则它收不到Message,当时让我迷糊了10分钟。

------解决方案--------------------
通过命名对象来完成,比较CreateMutex,在系统内只能存在一个同名对象,因此第二个对象创建时就会失败,在InitInstance中通过这点来进行判断就可以完成了
实际上是第二个进程创建后判断已经存在了另一进程就退出了