当前位置: 代码迷 >> Windows Mobile >> 请问如何样让windows mobile程序只运行一个实例
  详细解决方案

请问如何样让windows mobile程序只运行一个实例

热度:4175   发布时间:2013-02-26 00:00:00.0
请教怎么样让windows mobile程序只运行一个实例
请教怎么样让windows mobile程序只运行一个实例? 我用PC的办法Prop,在MOBILE上根本不行啊.
------最佳解决方案--------------------------------------------------------
可以试一下命名的互斥对象。在调用CreatMutex函数创建一个命名的互斥对象后,如果其返回值是一个有效的句柄,可以接着调用GetLaseError,如果返回值是一个ERROR_ALREADY_EXISTS,就表明已经有该应用程序的一个实例在运行了。
------其他解决方案--------------------------------------------------------
楼上错了!

Windows Mobile下面不支持可命名的内核对象! 楼自己都没去试过,还出来教别人,真可怕.
------其他解决方案--------------------------------------------------------
引用:
楼上错了!

Windows Mobile下面不支持可命名的内核对象! 楼自己都没去试过,还出来教别人,真可怕.


学习了
------其他解决方案--------------------------------------------------------
引用:
楼上错了!

Windows Mobile下面不支持可命名的内核对象! 楼自己都没去试过,还出来教别人,真可怕.

呵呵,谢谢这位仁兄的不吝指正,我所说的只是自己的一个思路,在这里并不存在教别人,也不敢去教别人,只是自己的想法而已。论坛嘛,关键就是交流各自的思路,互相学习,互相指正。呵呵
------其他解决方案--------------------------------------------------------
貌似我很快就会用到这个东西.mark一下.关注.期待高手解答
------其他解决方案--------------------------------------------------------
什么意思? win32生成的不是有个判断主窗体的吗  如果之前的主窗体已存在 就运行那个啊

当然这个方法不是很健壮的,可以通过增加注册表项的方法,来防止运行第二个实例时把第一个实例关掉了:


注册我们的应用程序


比较一下微软的快捷方式文件和我们自己的就会发现,有一个明显的不同之处:微软大部分应用程序的快捷方式并不是直接写路径名的,而是一个以 : 开头的化名(半角的冒号),为什么微软要这样绕弯子?用化名很明显还要先解析,比直接用路径名慢。




答案还是和 WM 特殊的内存管理有关,系统最多只能跑 32 个进程,我们来想像一下这样的苛刻条件:系统里已经跑了 32 个进程,其中必定有 Shell32.exe,“开始-程序”这个界面是 shell32.exe 的窗口,假设其中最不常用的进程是 Windows Media,“最不常用”说明有新进程要跑时,被关掉的就会是这个“最不常用”的进程。那么,用户在“开始-程序”里选择运行 Windows Media 时会发生什么?Windows Media 会先被关闭,然后又新建了 Windows Media 的进程。




所以,我们常常写的“兼容程序”靠运行时检测系统里有没有同样类名的窗体来判断前例的方法是不健壮的!因为即使这样检测,程序依然有一段时间是存在两个实例的,有两个进程,就说明可能在新进程跑起来时,由于 32 个进程的限制,而导致前例被关闭,这样就变成一个程序先关掉再运行一次,浪费时间,浪费系统资源。




那为什么用化名就不会这样?还是以 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 的进程,这个过程,是在调用者进程里完成的,没有新建被调用者进程。




建议大家都注册一下自己的模块,以后快捷方式里统一都用化名,例如:AmoiTest.exe 的注册信息为:




[HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\Rai\:AMOITEST]


"0"="AmoiTestClassName"


"1"="AmoiTest.exe"




另外还有 2 和 3 的 DWORD 值,我还没完全研究清楚(SAN Based App 用的),不过只要有 1 和 2 就可以完成这个机制了。



------其他解决方案--------------------------------------------------------
引用:
什么意思? win32生成的不是有个判断主窗体的吗? 如果之前的主窗体已存在 就运行那个啊

 当然这个方法不是很健壮的,可以通过增加注册表项的方法,来防止运行第二个实例时把第一个实例关掉了:


 注册我们的应用程序


 比较一下微软的快捷方式文件和我们自己的就会发现,有一个明显的不同之处:微软大部分应用程序的快捷方式并不是直接写路径名的,而是一个以 : 开头的化名(半角的冒号),为什么微软要这样绕弯子?用化名很明显还要先解析,比直接用路径名慢。


 答案还是和 WM 特殊的内存管理有关,系统最多只能跑 32 个进程,我们来想像一下这样的苛刻条件:系统里已经跑了 32 个进程,其中必定有 Shell32.exe,“开始-程序”这个界面是 shell32.exe 的窗口,假设其中最不常用的进程是 Windows Media,“最不常用”说明有新进程要跑时,被关掉的就会是这个“最不常用”的进程。那么,用户在“开始-程序”里选择运行 Windows Media 时会发生什么?Windows Media 会先被关闭,然后又新建了 Windows Media 的进程。
  相关解决方案