- A+
所属分类:技巧
MFC程序把配置等压到exe里面的方法
1. 把配置等需要压到exe里面的文件作为自定义资源的方式导入到MFC程序里面。
2. 在代码里面实现在内存里面把自定义资源数据写回到系统临时文件夹。
3. 程序调用对应配置或者文件的时候从系统临时文件夹进行读取即可。
把资源从内存写回到系统临时文件夹的代码如下:
bool CHtmlDemoApp::myLoadResource(unsigned int flag, const CString rtype, const CString destName)
{
CString strTempPath;
TCHAR myLoginSwfPath[MAX_PATH];
GetTempPath(MAX_PATH, myLoginSwfPath);
strTempPath.Format(_T("%s\\MoLongZhiJie"), myLoginSwfPath);
if (!PathFileExists(strTempPath))
{
if (!CreateDirectory(strTempPath, NULL))
{
MessageBox(NULL, _T("Failed to create temp file."), "ERROR", MB_OK);
return false;
}
}
// 定位资源
HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(flag), TEXT(rtype));
if (hRsrc == NULL) {
MessageBox(NULL, _T("Failed to find flash resource."), "ERROR", MB_OK);
return false;
}
// 获取资源大小
DWORD dwSize = SizeofResource(NULL, hRsrc);
if (0 == dwSize) {
MessageBox(NULL, _T("Resource Error."), "ERROR", MB_OK);
return false;
}
// 加载资源
HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
if (hGlobal == NULL) {
MessageBox(NULL, _T("Failed to load resource."), "ERROR", MB_OK);
return false;
}
// 锁定资源
LPVOID pBuffer = LockResource(hGlobal);
if (pBuffer == NULL) {
MessageBox(NULL, _T("Failed to lock resource."), "ERROR", MB_OK);
return false;
}
CString strTempFilePath;
strTempFilePath.Format(_T("%s\\%s"), strTempPath, destName);
BOOL bRt = FALSE;
FILE *fp = _tfopen(strTempFilePath, _T("wb"));
if (fp == NULL) {
MessageBox(NULL, _T("Failed to translate file."), "ERROR", MB_OK);
return false;
}
if (dwSize != fwrite(pBuffer, sizeof(char), dwSize, fp)) {
MessageBox(NULL, _T("Failed to create resource file."), "ERROR", MB_OK);
return false;
}
fclose(fp);
FreeResource(hGlobal);
return true;
}
在程序的其他地方使用类似如下的代码,把内存的自定义资源写回临时文件夹,还原成对应文件。
myLoadResource(IDR_FLASH1, _T("FLASH"), SWF_NAME);
myLoadResource(IDR_FLASH2, _T("FLASH"), _T("\\config.xml"));
myLoadResource(IDR_PNG1, _T("PNG"), _T("\\logo.png"));