文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>关于使用Xenocode PostBuild加壳的程序无法实现只允许运行一个实例的问题

关于使用Xenocode PostBuild加壳的程序无法实现只允许运行一个实例的问题

时间:2010-11-03  来源:何朝阳

图1 两个浏览器进程

  通过下面的代码,没有运行浏览器实例,但是返回的却不是null,而是上面图1中“6648”这个进程,却不能打开浏览器,这让我更加肯定是由于加壳引起的问题,返回的process和current肯定有不同的地方,关键是怎么把他们区分开来,过滤掉这个加壳的进程,先后试了很多方法,比如判断它们的启动时间,这虽然可以实现,但是不稳定,最后灵机一动,加壳后的进程的主模块加载模块所需的内存量肯定要比本身(current)的大,通过这个就可以过滤掉加壳的进程,并且如果存在多个实例的话,也可以区分开来,比判断启动时间的方法要好得多,最终修改代码,加壳后再次运行,一切正常!

#region 获取正在运行的实例,没有运行的实例返回null。
 1         #region 获取正在运行的实例,没有运行的实例返回null。
2 /// <summary>
3 /// 获取正在运行的实例,没有运行的实例返回null。
4 /// </summary>
5 public static Process RunningInstance()
6 {
7 Process current = Process.GetCurrentProcess();
8 Process[] processes = Process.GetProcessesByName(current.ProcessName);
9 foreach (Process process in processes)
10 {
11 if (process.Id != current.Id)
12 {
13 if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
14 {
15 return process;
16 }
17 }
18 }
19 return null;
20 }
21 #endregion

修改后的代码:

获取正在运行的实例,没有运行的实例返回null。
 1         #region 获取正在运行的实例,没有运行的实例返回null。
2 /// <summary>
3 /// 获取正在运行的实例,没有运行的实例返回null。
4 /// </summary>
5 public static Process RunningInstance()
6 {
7 Process current = Process.GetCurrentProcess();
8 Process[] processes = Process.GetProcessesByName(current.ProcessName);
9 foreach (Process process in processes)
10 {
11 //判断加载模块所需的内存量,过滤加壳的进程。
12 if (process.Id != current.Id && process.MainModule.ModuleMemorySize <= current.MainModule.ModuleMemorySize)
13 {
14 if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
15 {
16 return process;
17 }
18 }
19 }
20 return null;
21 }
22 #endregion

  由于水平有限,以上只是我的个人理解,还请各位大侠高手多多指教,感激不尽!

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载