为什么在WinMain和wWinMain中存在prevInstance,如果它始终为NULL

Spe*_*ine 7 c++ parameters winapi winmain

由于我是初学者,这可能是一个非常基本的问题.我正在启动DirectX 11,在创建我的第一个应用程序时,使用了wWinMain,在搜索WinMain和wWinMain之间的区别时,我遇到了这个参数prevInstance.

根据MSDN,prevInstance始终为null,并且因为它始终为null,为什么它存在(因为认为创建者不会给出无用的参数是合乎逻辑的).(引自书中),

如果您需要一种方法来确定应用程序的先前实例是否已在运行,则文档建议使用CreateMutex创建唯一命名的互斥锁.虽然将创建互斥锁,但CreateMutex函数将返回ERROR_ALREADY_EXISTS.

什么是互斥量,以及如何使用它(一个好的链接就足够了).并且看起来需要一个方法来查找是否存在应用程序的另一个实例,prevInstance应该有一个指针或对它的引用,显然不是这种情况,因为它是null.为什么会这样,prevInstance的作用是什么?

In *_*ico 16

Raymond Chen的博客几乎完全致力于讨论Windows API的各个方面,这些方面对我们来说是"奇怪的".幸运的是,他有一篇博客文章回答了这个问题:

在16位Windows中有一个名为GetInstanceData的函数.此函数使用HINSTANCE,指针和长度,并将该实例的内存复制到当前实例中.(这是与ReadProcessMemory等效的16位,其限制是第二个和第三个参数必须相同.)

...

这就是hPrevInstance参数为WinMain的原因.如果hPrevInstance为非NULL,则它是已运行的程序副本的实例句柄.您可以使用GetInstanceData从中复制数据,让您自己更快地开始工作.例如,您可能希望将主窗口句柄复制到上一个实例中,以便与之通信.

hPrevInstance是否为NULL或者没有告诉您是否是该程序的第一个副本.在16位Windows下,只有程序的第一个实例注册了它的类; 第二个和后续实例继续使用第一个实例注册的类.(实际上,如果他们尝试过,那么注册就会失败,因为该类已经存在.)因此,如果hPrevInstance为非NULL,则所有16位Windows程序都会跳过类注册.

设计Win32的人在端口WinMain时遇到了一些修复:hPrevInstance要传递什么?毕竟,Win32中并不存在整个模块/实例的东西,并且单独的地址空间意味着在第二个实例中跳过重新初始化的程序将不再起作用.所以Win32总是传递NULL,使所有程序都相信它们是第一个.

当然,hPrevInstance除了兼容性原因,现在这与Windows API无关,MSDN建议您使用互斥锁来检测应用程序的先前实例.

互斥体代表"互斥".您可以参考MSDN文档CreateMutex().有很多使用互斥锁来检测以前的应用程序实例的例子,比如这个.基本思想是创建一个具有您提出的唯一名称的互斥锁,然后尝试创建该命名互斥锁.如果CreateMutex()失败ERROR_ALREADY_EXISTS,您知道您的应用程序实例已经启动.

  • 我冒昧地总结了博客文章,所以你的回答不仅仅是一个链接. (4认同)
  • 我想,一切都很顺利.也许SO应该有一个当前正在编辑的答案的指标. (2认同)
  • Raymond Chen的博客可能是"为什么X是这样的,在Windows中?"的最佳来源,其中X是奇怪而奇怪的.那里解释了很多历史的怪异,很多都是很好的阅读. (2认同)