为什么会出现上面的问题?这是因为在使用了mfc共享库的时候,默认情况下,mfc使用主应用程序的资源句柄来加载资源模板。虽然我们调用的是dll中的函数来显示dll中的对话框,并且对应的对话框模板是存储在dll中的,但mfc仍旧在主应用程序也就是use.exe中寻找相应的对话框模板。由于在dll中所定义的对话框资源id与主应用程序中所定义的关于对话框的资源id相同,所以mfc就把主应用程序中的关于对话框显示了出来。如果二者不同,则mfc就认为dll中所定义的对话框资源不存在,dlg.domodal会返回0,也就是什么都不会显示。
那么如何解决上述问题呢?解决办法就是在适当的时候进行模块状态切换,以保证具有当前状态的模块是我们所需要的模块从而使用正确的资源。mfc提供了下列函数和宏来完成这些工作:
afxgetstaticmodulestate:这是一个函数,其函数原型为:
afx_module_state* afxapi afxgetstaticmodulestate( );
此函数在堆栈上构造afx_module_state类的实例pmodulestate并对其赋值后将其返回。在afx_module_state类的构造函数中,该类获取指向当前模块状态的指针并将其存储在成员变量中,然后将pmodulestate设置为新的有效模块状态。在它的析构函数中,该类将存储在其成员变量中的指针还原为存贮的前一个模块状态。