答案还是和 WM 特殊的内存管理有关,系统最多只能跑 32 个进程,我们来想像一下这样的苛刻条件:系统里已经跑了 32 个进程,其中必定有 Shell32.exe,“开始-程序”这个界面是 shell32.exe 的窗口,假设其中最不常用的进程是 Windows Media,“最不常用”说明有新进程要跑时,被关掉的就会是这个“最不常用”的进程。那么,用户在“开始-程序”里选择运行 Windows Media 时会发生什么?Windows Media 会先被关闭,然后又新建了 Windows Media 的进程。
那为什么用化名就不会这样?还是以 Windows Media 为例,Windows Media 的化名是 :WMPLAYER,打开注册表 [HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\Rai\:WMPLAYER] 会发现这个键下面有一个名为 0 的字符串值,其数据是 WMP for Mobile Devices,这刚好是 Windows Media 主窗体的类名,还有一个名为 1 的字符串值,数据是其程序名。当某个进程用 ShellExecuteEx 运行 :WMPLAYER 或者指向 :WMPLAYER 的文件时,ShellExecuteEx 会先查找系统里有没有类名为 WMP for Mobile Devices 的窗体,如果找到就激活,不会再新建 Windows Media 的进程,这个过程,是在调用者进程里完成的,没有新建被调用者进程。
Two or more processes can call CreateMutex to create the same named mutex. The first process actually creates the mutex, and subsequent processes open a handle to the existing mutex. This enables multiple processes to get handles of the same mutex, while relieving you of the responsibility of ensuring that the creating process is started first. When using this technique, set the bInitialOwner flag to FALSE; otherwise, it can be difficult to be certain which process has initial ownership.
Multiple processes can have handles of the same mutex object, enabling use of the object for interprocess synchronization. To provide object sharing, a process can specify the name of a mutex object in a call to the CreateMutex function.
[其他解释] windows mobile 本身只能运行一个实例。你不用再费心了。 [其他解释] 路过学习。 [其他解释] 问google啊 [其他解释] xx [其他解释] 帮你顶 [其他解释] 不错啊 [其他解释] study [其他解释] 咋没个人辛苦下,写几句代码验证下呢~,~ [其他解释] 路过学习。。。 [其他解释] 学习一下呵呵 [其他解释] 可以遍历进程列表根据进程名来判断是否有实例了 [其他解释] 不懂,学习 [其他解释] 该回复于2009-12-21 20:04:32被版主删除 [其他解释] mark [其他解释]
up [其他解释] 0x01)); CloseHandle(hEvent); return NULL; } } while (++cTries < 2); // only try twice
// If we didn't find the window, the other application was probably
// shutting down, so we'll just continue } }
// Done return hEvent; }
[其他解释]
呵呵,有意思。WM支持。
1楼说的是对的,标准做法就是CreatMutex, SDK里很多这样的sample,比如 Windows Mobile 6 SDK\Samples\Common\CPP\Win32\BasicApp\basicapp.cpp
// Create a named event hEvent = CreateEvent(NULL, TRUE, FALSE, g_szClassName); if (hEvent != NULL) { // If the event already existed, that means there's another copy of our app // already running if (GetLastError() == ERROR_ALREADY_EXISTS) { do { // Just in case the other window needs to finish initialization Sleep(cTries ? 250 : 0);
// Try to find the other application window hwnd = FindWindow(g_szClassName, NULL); if (hwnd != NULL) { SetForegroundWindow((HWND)((UINT_PTR)hwnd [其他解释] 最简单的办法:对配置文件加锁.程序启动过后一直维持.进程退出系统自动释放. [其他解释]