这个是我是当前实际遇到的问题,可能比较少见,但是一旦遇到不太容易定位原因。
所以在这里把解决过程记录下来。
主工程(Exe)是MFC的MDI工程,UI_Widget和UI_Base是选择使用MFC的Win32 DLL(改了个扩展名)。
这两个DLL中分别导出C++类,导出类包含MFC类类型的成员。在需要加的地方,已经都加上了:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
AfxSetResourceHandle(hInstance); // 这个solution中使用了公共资源模块,hInstance即为其句柄
问题现象是运行时报从资源句柄中无法找到指定ID的对话框模版。
一开始百思不得其解,调查了很长时间后,才终于找到原因。
Exe调用UI_Widget的一个导出类C1的方法CreatePanel,CreatePanel是C1的基类C0的方法,
C1并未重载,所以直接进入了基类C0(位于模块UI_Base)。之后进入C0的基类CSubPanel,
再进入MFC基类CDialog,就在这里出现了一次意外的模块跳转,问题就出在这里。上面两句代码
调用位置是在UI_Base中,这次意外跳转后,回到模块UI_Widget,才进入MFC基类方法访问资源,
当然资源句柄是无效的。
出现意外跳转的原因推测是,CSubPanel这个类是在一个静态库工程中,UI_Widget和UI_Base都
Link了这个lib,而Exe直接调用的是UI_Widget。我写了个测试程序,两个dll直接静链MFC,在进入
MFC基类时,就不再跳转到子类所在模块了。
PS:之所以不使用MFC扩展dll,是因为它只能使用共享方式链接MFC,这就使得程序的运行环境
必须安装VS的发布包。只是想减掉这个包袱罢了。