我有一个MFC应用程序需要动态加载DLL。该DLL将用于检索运行时值,然后卸载。我需要创建MFC DLL并通过AfxLoadLibrary()加载它吗?还是可以创建传统的C++ DLL并使用Win32 LoadLibrary()调用?这有关系吗?
AfxLoadLibrary()
LoadLibrary()
cbjzeqam1#
MSDN Library文章的“备注”部分明确提到了这一点:如果您的应用程序使用多个线程并且动态加载扩展DLL,请确保使用AfxLoadLibrary和AfxFreeLibrary(而不是Win32函数LoadLibrary和FreeLibrary)。使用AfxLoadLibrary和AfxFreeLibrary可确保在加载和卸载扩展DLL时执行的启动和关闭代码不会损坏全局MFC状态。因此,如果您要载入包含MFC程式码的DLL,或是在程式中使用执行绪,就应该使用它。也就是说,至少在现代版本的MFC中,AfxLoadLibrary()没有做任何特别的事情:
HINSTANCE AFXAPI AfxLoadLibrary(LPCTSTR lpszModuleName) { ASSERT(lpszModuleName != NULL); HINSTANCE hInstLib = LoadLibrary(lpszModuleName); return hInstLib; }
所以如果你猜错了,没有什么会爆炸得很厉害。谢天谢地。
zazmityj2#
如果您要建立完全不使用MFC的一般C++ DLL,就不需要建立MFC DLL,而且应该可以使用一般的LoadLibrary()。
zour9fqk3#
@HansPassant的答案不正确!尽管这是atlmfc\dlinit.cpp中使用的代码,但函数LoadLibrary将调用IsolationAwareLoadLibrary!其源代码位于WinBase. Inl中。例如,您可以使用反汇编程序轻松验证这一点。因此,在windows操作系统中,如果您不确定该库是否使用MFC,然后总是调用AfxLoadLibrary!!!这就是为什么通常不能使用boost::dll::shared_library
3条答案
按热度按时间cbjzeqam1#
MSDN Library文章的“备注”部分明确提到了这一点:
如果您的应用程序使用多个线程并且动态加载扩展DLL,请确保使用AfxLoadLibrary和AfxFreeLibrary(而不是Win32函数LoadLibrary和FreeLibrary)。使用AfxLoadLibrary和AfxFreeLibrary可确保在加载和卸载扩展DLL时执行的启动和关闭代码不会损坏全局MFC状态。
因此,如果您要载入包含MFC程式码的DLL,或是在程式中使用执行绪,就应该使用它。
也就是说,至少在现代版本的MFC中,AfxLoadLibrary()没有做任何特别的事情:
所以如果你猜错了,没有什么会爆炸得很厉害。谢天谢地。
zazmityj2#
如果您要建立完全不使用MFC的一般C++ DLL,就不需要建立MFC DLL,而且应该可以使用一般的
LoadLibrary()
。zour9fqk3#
@HansPassant的答案不正确!尽管这是atlmfc\dlinit.cpp中使用的代码,但函数LoadLibrary将调用IsolationAwareLoadLibrary!其源代码位于WinBase. Inl中。例如,您可以使用反汇编程序轻松验证这一点。因此,在windows操作系统中,如果您不确定该库是否使用MFC,然后总是调用AfxLoadLibrary!!!这就是为什么通常不能使用boost::dll::shared_library