我正在开发一个在进程启动时注入一个dll的应用程序(Suspend - > Inject - > Resume)
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(...);
如果缺少某些信息,请告诉我。 谢谢!
答案 0 :(得分:3)
当调用入口点函数 DLLMain 时,保证在进程地址空间中加载Kernel32.dll。 MessageBox 驻留在 user32.dll 中,并且根据 Best practices for creating DLL 从 user32.dll 调用函数是严格禁止。
你可以
调用 OutputDebugString 进行任何调试程序跟踪。此函数驻留在kernel32.dll中,应该可以安全地调用。
在您的应用程序加载任何其他dll之前,请自行调用 MessageBox 。这将确保user32.dll及其依赖项 已加载。这样在DllMain中调用 MessageBox 可能会有 更好的成功机会。但你的里程可能会有所不同。
答案 1 :(得分:2)
问题不在于CRT。您不能从MessageBox
DllMain
或任何其他非重要功能