Win32单实例应用程序实现

本文介绍如何在Win32环境下创建一个确保仅运行一个实例的应用程序。通过利用Windows API,如全局原子(GlobalAtom)和进程间通信(IPC)来检查已存在的进程,确保应用不会多次启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  开发者还能够注意到,在Win16和Win32之间的另一种差别是,所有的Win32应用程序都是以单实例方式来运行的,甚至当该应用程序的另一个实例正在运行之中也是如此。这是因为在Win32环境下,所有的应用程序都有一个单独的地址空间。结果,传递给一个应用程序的WinMain过程的hPrevInstance参数将总是为NULL。

  一般来说,这会给应用程序的开发者带来方便。在Win16下,开发者不得不清楚的知道是否必须运行某个应用程序的多个实例,并且当这些实例共享该应用程序的代码段时,要提前报警以确保该应用程序能够正常地工作。在Win32下,开发者则不需要担心多实例的问题。也不用为了确保应用程序的正常运行而提前报警。

  实际上,上面的论述并不是完全正确的。对于USER32或GDI32来说,内存访问就不需要提前报警,但是开发者仍然需要注意它。例如,如果该应用程序访问一个数据文件,开发者必须确保该应用程序的两个实例能够同时的或顺序的访问该文件。为了避免这种情况发生,开发者可以使用FindWindow函数,以确保同一时间该应用程序只有一个实例在运行:

if (hWndApp = FindWindow(szAppMainWindowClassName, NULL)) {

hWndPopup = GetLastActivePopup(hWndApp);

BringWindowToTop(hWndApp);

if ( IsIconic(hWndPopup) )

ShowWindow(hWndPopup, SW_RESTORE);

else

SetForegroundWindow(hWndPopup);

return FALSE;

}

  对于Win32的应用程序来说,它工作正常,但是对于Windows NT,则带来了另外的问题。在Windows NT中,一个应用程序可以被加载多次,并且时间间隔可以非常小。例如,如果您使用"启动"命令从批处理文件启动一个应用程序,Windows NT将一个接一个的启动这些进程,但是其中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值