中国的大多数软件的一个bug和我眼中最保险的防止程序运行多次的方法


以下转载自:

http://blog.csdn.net/jun_01/archive/2006/07/31/1005475.aspx

1,今天看到一篇文章,号称中国大多数 的软件都存在一个bug。 据说,具有托盘图标的软件,如果把系统的explorer.exe进程杀掉,然后重新开一个这个进程(本人经常采用此方法来释放内存)。微软的软件或者国 外大部分软件,都可以自动恢复托盘图标,而大多数国产软件却不能恢复。对于很多隐藏了主界面的软件,这是一个恶梦。

    我做了一下试验,操作系统自带的那些图标都可以恢复,另外一个国外免费的过滤垃圾邮件软件也正常,但金山词霸和输入却似乎恢复不了。当然我自己的程序也有问题。其实解决方法很简单,只要注册一个叫“TaskbarCreated”的消息,并响应它就可以了。

 
2, 关于防止程序运行多个实例,如果有人在搜索引擎里搜索一下,就会发现和这个话题相关的文章太多了。当然,这些文章有90%的相似度,并且都是delphi 和vb的。很明显是似乎抄袭的。并且里边的内容也没用。全是用FindWindow,这样太不保险了。因为一个窗体的标题实在容易改变,而且容易重复。

而我采用的是用共享数据段的方法,其实代码量不多,使用也方便。我只记得以前用过,但现在忘了,于是我花了半个小时在网络上搜索,一无所获后,又在自己的硬盘里找,又过了大约30分钟,我终于找到了,看来很有必要备忘一下:


#pragma  data_seg("sharedata")
HWND 
volatile  g_hPreWnd  =  NULL;
#pragma  data_seg()
#pragma  comment(linker,"/section:sharedata,RWS")


HINSTANCE g_hInst;

int  APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     
int        nCmdShow)
{
 
if (g_hPreWnd  !=  NULL){
  ShowWindow(g_hPreWnd, SW_SHOWNORMAL);
  SetForegroundWindow(g_hPreWnd);
  
return   0 ;
 }
.
.
.

 

 由于调试时写错了comment中的段名,编译选项和段申明不一致,导致出不了效果,我一度怀疑这个方法只在dll中有效,因为我之前使用它也是在hook的dll中,而网上的文章也都是介绍dll间共享数据的。但真正解决问题后,我才发现了实践出真知的快感。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值