3


我正在开发一个在进程启动时注入 dll 的应用程序(暂停 --> 注入 --> 恢复)在 DllMain 中使用 DLL_PROCESS_ATTACH 的第一个调用(在我注入的 dll 中)是对 MessageBox() 的调用(只是用于调试目的)。但是,对 MessageBox() 的调用有时会弹出错误并使注入的进程崩溃。

运行时错误!
程序:C:\Program Files\Microsoft Office\Office14\OUTLOOK.EXE

R6030
- CRT 未初始化

例如,这可以通过 Outlook 和 Winword 重现。尽管记事本、IE、CMD、Calc 和许多其他工具 - 打印消息框并正常继续。

打印消息框对我来说不是必须的,所以我只想能够检查CRT是否进行了初始化,所以我可以像这样正常继续:

case DLL_PROCESS_ATTACH:
     if (IsCRTInitialized())
        MessageBox(...);

如果缺少某些信息,请告诉我。谢谢!

4

2 回答 2

3

调用入口点函数DLLMain时,保证将 Kernel32.dll 加载到进程地址空间中。MessageBox位于user32.dll中,根据从user32.dll创建 DLL调用函数的最佳实践是严格禁止的。

你可以

  1. 为任何调试器跟踪调用OutputDebugString。该函数位于 kernel32.dll 中,应该可以安全调用。

  2. 在您的应用程序加载任何其他 dll 之前,请自己调用MessageBox。这将确保已加载 user32.dll 及其依赖项。这样在 DllMain 中调用MessageBox可能有更好的成功机会。但是您的里程可能会有所不同。

于 2011-11-22T12:45:28.863 回答
2

问题不在于 CRT。您不得从以下位置调用MessageBox或任何其他重要功能DllMain

于 2011-11-22T11:49:33.937 回答