H5W3
当前位置:H5W3 > 其他技术问题 > 正文

为什么在DLL初始化函数中调用有activex控件的对话框无法直接显示?

MFC DLL中含有一个activeX控件的对话框,在DLL的导出函数中调用该对话框可以正常显示。但删除导出函数,直接在DLL的初始化函数中调用该对话框,然后用EXE加载DLL运行却无法正常显示对话框,注释掉activex控件的话对话框就能正常显示。请问是为什么呢?怎么让DLL初始化函数调用对话框正常显示呢?

回答:

并不是所有操作都可以在 DllMain() 内执行, 对于被限制的操作, 应该考虑其他执行方式, 譬如新开线程.


参考 MSDN 文档
https://docs.microsoft.com/en…

You should never perform the following tasks from within DllMain:

  • Call LoadLibrary or LoadLibraryEx (either directly or indirectly). This can cause a deadlock or a crash.
  • Call GetStringTypeA, GetStringTypeEx, or GetStringTypeW (either directly or indirectly). This can cause a deadlock or a crash.
  • Synchronize with other threads. This can cause a deadlock.
  • Acquire a synchronization object that is owned by code that is waiting to acquire the loader lock. This can cause a deadlock.
  • Initialize COM threads by using CoInitializeEx. Under certain conditions, this function can call LoadLibraryEx.
  • Call the registry functions. These functions are implemented in Advapi32.dll. If Advapi32.dll is not initialized before your DLL, the DLL can access uninitialized memory and cause the process to crash.
  • Call CreateProcess. Creating a process can load another DLL.
  • Call ExitThread. Exiting a thread during DLL detach can cause the loader lock to be acquired again, causing a deadlock or a crash.
  • Call CreateThread. Creating a thread can work if you do not synchronize with other threads, but it is risky.
  • Create a named pipe or other named object (Windows 2000 only). In Windows 2000, named objects are provided by the Terminal Services DLL. If this DLL is not initialized, calls to the DLL can cause the process to crash.
  • Use the memory management function from the dynamic C Run-Time (CRT). If the CRT DLL is not initialized, calls to these functions can cause the process to crash.
  • Call functions in User32.dll or Gdi32.dll. Some functions load another DLL, which may not be initialized.
  • Use managed code.

本文地址:H5W3 » 为什么在DLL初始化函数中调用有activex控件的对话框无法直接显示?

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址