为什么在WinMain和wWinMain中存在prevInstance,如果它总是NULL
Why does prevInstance exist in WinMain and wWinMain if it is always NULL
由于我是初学者,这可能是一个非常基本的问题。我正在启动DirectX 11,在创建我的第一个应用程序时,使用了wWinMain,在搜索WinMain和wWinMain之间的差异时,我遇到了这个参数prevInstance。
根据MSDN,prevInstance总是空的,因为它总是空的,为什么它存在(因为它是合乎逻辑的,认为创作者不会给一个无用的参数)。(引自书中)
,如果您需要一种方法来确定先前的实例是否存在应用程序已经运行,文档建议创建使用CreateMutex创建一个唯一命名的互斥锁。尽管互斥会创建时,CreateMutex函数将返回ERROR_ALREADY_EXISTS。
什么是互斥锁,如何使用它(一个好的链接就足够了)。看起来需要一个方法来查找应用程序的另一个实例是否存在,prevInstance应该有一个指向它的指针或引用,这显然不是这种情况,因为它是空的。为什么会这样,prevInstance的作用是什么?
Raymond Chen的博客几乎完全致力于讨论Windows API中那些对我们来说很"奇怪"的方面。幸运的是,他有一篇博客文章回答了这个问题:
在16位的Windows中,有一个函数叫做GetInstanceData。这函数接受一个HINSTANCE、一个指针和一个长度,并复制内存从那个实例到当前实例。(这有点相当于ReadProcessMemory的16位,但限制是第二个和第三个参数必须相同。)
…
这就是hPrevInstance参数为WinMain的原因。如果hPrevInstance是非null的,那么它就是副本的实例句柄已经在运行的程序。你可以使用GetInstanceData来从上面复制数据,让你更快地离开地面。例如,您可能希望将主窗口句柄从前一个窗口中复制出来实例,以便您可以与它通信。
是否hPrevInstance是NULL或不告诉你你是否是程序的第一份拷贝。在16位Windows下,只有第一个一个程序的实例注册了它的类;第二次及后续实例继续使用由第一个实例。(事实上,如果他们尝试,注册将会失败因为这个类已经存在了。)因此,所有16位的Windows程序跳过类注册,如果hPrevInstance是非空。
设计Win32的人发现他们遇到了一些问题是时候移植WinMain了:为hPrevInstance传递什么?的毕竟,整个模块/实例的东西在Win32中是不存在的单独的地址空间意味着跳过的程序在第二个实例中重新初始化将不再工作。所以Win32总是传递NULL,使所有程序都认为它们是第一个。
当然,除了兼容性原因,hPrevInstance
现在与Windows API无关,MSDN建议您使用互斥锁来检测应用程序的先前实例。
互斥代表互斥。您可以参考CreateMutex()
的MSDN文档。有很多使用互斥体来检测应用程序以前的实例的例子,比如这个。基本思想是创建一个具有您想出来的唯一名称的互斥锁,然后尝试创建那个命名的互斥锁。如果CreateMutex()
和ERROR_ALREADY_EXISTS
失败,您就知道您的应用程序的一个实例已经启动了。
prev实例参数用于16位Windows兼容性。我想这在WinMain的MSDN参考中有说明,至少过去是这样的
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如果我在相应 char 数组的声明中为其提供额外的元素,是否会自动设置 NULL?
- 如果指针在C++为 NULL 则修改指针
- 从指针访问值或获取其默认值(如果为 null)的最干净方法
- GNU 链接器:如果头文件中的指针被声明为 NULL 和/或 extern,则出错
- 为什么如果说明未输入null时
- 如果 null 不是有效值,则使参数成为引用而不是指针
- 如果将其添加为全局结构,则如何将其添加为NULL
- 如果输入为 NULL,则返回 -1
- 如果指针设置为 NULL,则对它的任何引用都不会或通过它也是 NULL
- C++如果没有任何像 C# 那样传递的内容,请将函数参数设置为 null
- 如果 std::shared_ptr 是从非 null 构造的,为什么它不需要知道完整的类型?
- 在 c++ 中抛出一个值(如果该值为 null)
- 如果指向成员函数的指针为NULL,则方法的部分专用化
- 如果我无法访问字符串变量,如何检查 NULL(空/0) 字符串
- 如果 EBP 帧指针为 NULL,堆栈是否损坏
- 如果列结果为Null,则C++SQLite停止错误
- 如果在strchr()中传递了NULL,该怎么办
- 如果不为null,则为指针赋值
- Win32 c++ openprocess应该返回null,如果用户已经退出应用程序,但没有