如何在静态库中使用MFC对话框资源
本帖最后由 funnymoon_dncs 于 2012-11-19 15:15:51 编辑 有个问题请教下大家。我有一个动态库里面有一个CDialog类用来弹出对话框。现在我想把这个库改成静态的,这样就可以减少DLL的数量。目前有个问题,就是静态编译以后运行时弹出对话框的地方会出错。具体就在AfxGetResourceHandle这个函数。我查了下资料,说是静态库没有自己的资源,需要使用调用者的资源。调用者是个动态库。我尝试把静态库的资源加入到动态库的资源中,但是没有变化仍然会崩溃。
由于对话框比较复杂,不想弄一大堆API来实现这个对话框。所以在此请问下具体如何操作才能解决这个问题。谢谢大家的帮助。
附带说明一下,我使用的是VS2005,谢谢。
[解决办法]
AFX_MANAGE_STATE(AfxGetStaticModuleState());
在对话框调用函数最前面加上那句
//TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,
//则从此 DLL 导出的任何调入
//MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
//该函数的最前面。
//
//例如:
//
//extern "C" BOOL PASCAL EXPORT ExportedFunction()
//{
//AFX_MANAGE_STATE(AfxGetStaticModuleState());
//// 此处为普通函数体
//}
//
//此宏先于任何 MFC 调用
//出现在每个函数中十分重要。这意味着
//它必须作为函数中的第一个语句
//出现,甚至先于所有对象变量声明,
//这是因为它们的构造函数可能生成 MFC
//DLL 调用。
//
//有关其他详细信息,
//请参阅 MFC 技术说明 33 和 58。
//
[解决办法]
静态库体积太大。建议DLL内容合并来减少DLL数量
[解决办法]
我觉得不是是你的静态库的问题
而是动态库吧
动态库被主程序调用,动态库中又有资源,因为已经静态库插入到你的 dll中了。
此时有2中法子解决
afxsetresourcehandle
还有afxmodulestatic 等宏吧
我记得不是很正确,大概是有这2中法子。
//
// Make sure the MFC state is correct.
//
AFX_MANAGE_STATE(AfxGetAppModuleState())
//
// The rest of your code...
//