我正在开发一个进程启动时注入dll的应用程序(暂停 - >注入 - >恢复) DllMain中的第一个调用与DLL_PROCESS_ATTACH(在我注入的DLL中)是对MessageBox()的调用(仅用于调试目的)。 但是,对MessageBox()的这种调用有时会弹出错误并使注入的进程崩溃。检测CRT初始化是否在注入过程中完成
运行时错误!
程序:C:\ Program Files文件\微软 办公室\ OFFICE14 \ OUTLOOK.EXE
R6030
- CRT没有初始化
这是可重复使用Outlook和对中Winword例如。尽管记事本,IE,CMD,Calc和许多其他 - 打印消息框并继续正常。
打印一个消息框,是不是必须具备的我,所以我只是想能够检查CRT是否已经完成初始化或没有,所以我可以正常地继续这样的:
case DLL_PROCESS_ATTACH:
if (IsCRTInitialized())
MessageBox(...);
请让我知道是否缺少一些信息。 谢谢!
谢谢@parapura。我知道OutputDebugString(实际上它已经在使用)。但是这并不能解决这个问题。这个消息框的主要目的不仅仅是向我展示一些文本,还能够在它的第一步中调试附加到任何进程创建。大部分进程都可以在这个早期阶段调用MessageBox()。 – Elad
继续:我没有试图找到强制显示消息框的方法(我知道我不能),但至少知道CRT未初始化就足够了。我以为我可以尝试使用** user32.dll *(而不是** LoadLibrary **)上的** GetModuleHanlde **来检查它,但实际上我得到一个有效的句柄HMODULE来* user32.dll * ...我没有想要加载* user32。DLL *在我注入的DLL,因为它可能不需要。 – Elad
如果您的目标是调试附加进程创建。使用[图像文件执行选项](http://msdn.microsoft.com/en-us/library/a329t4ed(v = vs.71).aspx) –