Winapi 如何检查我的代码是否在DllMain中执行

Winapi 如何检查我的代码是否在DllMain中执行,winapi,dll,Winapi,Dll,我正在为一些系统编写一个插件,但是在dll初始化过程中有一些行为不正确的应用程序调用我的插件(来自DllMain或InitInstance,后者是DllMain的包装器) 我想知道是否有办法确定代码是否在DllMain中执行。我不希望在不导致死锁的情况下优雅地失败(我的插件正在执行的代码涉及dll加载、线程创建和等待事件,如果在DllMain中执行,则会导致死锁) 我知道在DllMain退出之前CreateThread不会执行,但是我无法从另一个线程进行初始化,因为它涉及COM。我不相信有任何系

我正在为一些系统编写一个插件,但是在dll初始化过程中有一些行为不正确的应用程序调用我的插件(来自DllMain或InitInstance,后者是DllMain的包装器)

我想知道是否有办法确定代码是否在DllMain中执行。我不希望在不导致死锁的情况下优雅地失败(我的插件正在执行的代码涉及dll加载、线程创建和等待事件,如果在DllMain中执行,则会导致死锁)


我知道在DllMain退出之前CreateThread不会执行,但是我无法从另一个线程进行初始化,因为它涉及COM。

我不相信有任何系统提供的方法可以做到这一点。但是,由于加载程序锁保证一次只运行一个
dllmain
,因此可以很容易地在
dllmain
的开头设置一个标志,并在结尾将其取消设置。

当我遇到这种情况而printf没有剪切它时,我将尝试创建一个文件。将消息与时间戳一起用作文件名。这可能会对你有所帮助,祝你好运。

在发生这种情况时,没有任何机制可以检测到它。每个人都应该遵守规则。

实际上,您要求的是一种查看加载程序锁状态的方法,但是Windows API不允许这样做,因为它不会以任何方式公开加载程序锁。即使您能够获得锁状态,也不能保证它在后续代码的执行过程中保持不变——您必须获得它,这超出了全部目的,因为这是您想要避免的事情

因此,据我所知,解决这个问题的唯一实用方法是记录您的插件,并禁止使用DllMain()。如果这意味着一些组件所有者将不得不对其DLL初始化进行轻微的重新设计,那就这样吧