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

时间:2011-04-06 07:20:59

标签: winapi dll

我正在为某个系统编写插件,但是有一些行为不端的应用程序在dll初始化期间调用我的插件(来自DllMain或InitInstance,这是DllMain的包装器)。

我想知道是否有办法找出代码是否在DllMain中执行。我不会优雅地失败而不会造成死锁(我的插件执行的代码涉及dll加载,线程创建和等待事件,如果在DllMain中执行会导致死锁)。

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

4 个答案:

答案 0 :(得分:3)

实际上,您正在寻找一种方法来查看加载程序锁定状态,但Windows API不允许这样做,因为它不会以任何方式公开加载程序锁定。即使您能够获得锁定状态,也无法保证在执行后续代码期间它保持不变 - 您必须获取它,并且这会击败整个目的,因为这是您想要避免的事情

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

当我遇到这样的情况并且printf没有剪切它时,我会尝试创建一个文件。将您的消息用作文件名以及时间戳。这可能对你有所帮助,祝你好运。

答案 3 :(得分:0)

没有机制可以检测到这种情况。每个人都应该遵守规则。