概述
我们在开发MFC项目中,如果是一个项目还好,如果我们分为不同的项目,并且每个项目作为Dll提供,这样资源可能在每个动态库中都存储在,非常不利于管理,所以我们就想着把资源单独作为一个Dll库提供。
资源Dll的实现
创建资源Dll 创建后先进行编译,编译后,表示咱们工程没问题,下面还有一个链接选项需要设置 下面咱们就可以自己添加资源、编辑资源了。
主程序的调用设置资源动态库。
BOOL CMultilingualDemoApp::InitInstance()
{
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
m_hLangDLL = NULL;
AfxEnableControlContainer();
CShellManager *pShellManager = new CShellManager;
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
HINSTANCE m_hLangDLL = ::LoadLibrary(_T("Resource_zh.dll"));
if(m_hLangDLL != NULL)
{
AfxSetResourceHandle(m_hLangDLL);
}
else
{
AfxMessageBox(_T("资源DLL文件加载失败!"));
exit(1);
}
到此其实就实现了资源单独动态库的实现。
题外话:
资源单独作为Dll可以成功,那么我们如果是多语言,每一个语言都可以单独的一个Dll,这样就实现了使用Dll实现多语言的支持。 下面代码是实现资源动态加载:
BOOL CMultilingualDemoDlg::ResetDialog()
{
AfxOleTerm(FALSE);
if(m_hLangDLL)
{
FreeLibrary(m_hLangDLL);
}
STARTUPINFO StartupInfo={0};
PROCESS_INFORMATION ProcessInfo;
StartupInfo.cb=sizeof(STARTUPINFO);
char Path[256];
GetModuleFileName(NULL,(LPSTR)(LPCTSTR)Path,255);
CreateProcess(NULL,(LPSTR)(LPCTSTR)Path,NULL,NULL,FALSE,0,NULL,NULL,&StartupInfo,&ProcessInfo);
return TRUE;
}
|