2011-11-22 82 views
3


我正在开发一个进程启动时注入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(...); 

请让我知道是否缺少一些信息。 谢谢!

回答

2

问题不在于CRT。你不准叫MessageBox或任何其他非平凡函数从DllMain

3

的Kernel32.dll保证在进程的地址空间将被加载时的入口点函数DLLMain被调用。 的MessageBox驻留在user32.dll中和按Best practices for creating DLL调用函数从user32.dll中是一个严格的禁忌。

您可以

  1. 呼叫OutputDebugString任何调试跟踪。该函数驻留在kernel32.dll中,应该可以安全地调用。

  2. 在您的应用程序加载任何其他dll之前,请自己拨打MessageBox。这将确保已加载user32.dll及其依赖关系为 。这种方式呼叫MessageBox在DllMain可能有 成功的机会更大。但你的里程可能会有所不同

+0

谢谢@parapura。我知道OutputDebugString(实际上它已经在使用)。但是这并不能解决这个问题。这个消息框的主要目的不仅仅是向我展示一些文本,还能够在它的第一步中调试附加到任何进程创建。大部分进程都可以在这个早期阶段调用MessageBox()。 – Elad

+0

继续:我没有试图找到强制显示消息框的方法(我知道我不能),但至少知道CRT未初始化就足够了。我以为我可以尝试使用** user32.dll *(而不是** LoadLibrary **)上的** GetModuleHanlde **来检查它,但实际上我得到一个有效的句柄HMODULE来* user32.dll * ...我没有想要加载* user32。DLL *在我注入的DLL,因为它可能不需要。 – Elad

+0

如果您的目标是调试附加进程创建。使用[图像文件执行选项](http://msdn.microsoft.com/en-us/library/a329t4ed(v = vs.71).aspx) –

相关问题