2014-07-22 46 views
1

DLLMAIN()/DLL_PROCESS_ATTACH中加载DLL可能会造成麻烦。但可能COM Objects使用e.q. CoInitialize()/ CoCreateInstance()?在dllmain()/ DLL_PROCESS_ATTACH中允许实例化com对象?

编辑:现在的问题是: 可能创建COM实例导致类似的错误,如在这种情况下加载DLL? 加载DLL创建COM实例在某种程度上对我来说似乎是相似的。

回答

2

我不确定你从哪里得到这个引用,但它听起来不对。

你不应该把任何意义的代码放进DllMain。尤其是调用LoadLibrary的代码。很多Windows API都会调用LoadLibrary,所以最好避免在这里进行任何复杂的初始化。使用全局C++对象(对于它的构造函数)或更好,导出一个用于初始化的函数。

用于进程内组件的CoCreateInstance最终将调用LoadLibrary或其变体之一。在DllMain中调用这个函数也不是明智的做法。

+1

在DllMain的上下文中不会调用全局对象的构造函数吗? (我可以想象运行时库如何避免在加载时DLL中为全局变量执行这些操作,但是没有看到运行时DLL中的全局变量是如何可能的。) –

+0

@HarryJohnston - 我可能虽然(天真地)初始化全局变量的CRT初始化发生在DllMain之后,加载器操作之外以及调用LoadLibrary的线程中。我需要仔细检查一些来源。我会适当地更新我的答案。 – selbie