在很多外挂的安装包中,并没有对话框和图标文件。好处就是文件少,也防止用户修改对话框中的属性,导致程序异常。以下为大家提供一个方法,仅供参考:
1、添加资源文件
2、新建自定义资源类型
3、添加资源文件(如果代码包可能随时发给别人或更换文件夹,建议将资源文件设为相对路径)
4、解析对话框位置,删除对话框,(只有对话框显示之后,就可以删除掉对话框)
附加代码:
bool FreeResFile(unsigned long m_lResourceID, const char* m_strResourceType, const char* m_strFileName, char dlxPath[1024])
{
//设置初始状态
AFX_MANAGE_STATE(AfxGetStaticModuleState());//切换到dll模块才能获取dll实例
TCHAR szPath[MAX_PATH] = { 0 };
HMODULE m_hModule = AfxGetInstanceHandleHelper();
GetModuleFileName(m_hModule, szPath, MAX_PATH);
(_tcsrchr(szPath, '\\'))[0] = 0;
(_tcsrchr(szPath, '\\'))[1] = 0;
#ifdef UNICODE
std::string mStr = WStringToMBytes(szPath);
strcpy(dlxPath, mStr.c_str());
#else
strcpy(dlxPath, szPath);
#endif
//构造完整释放文件路径
char dlxPath11[1024] = "";
sprintf_s(dlxPath11, "%sapplication\\%s", dlxPath, m_strFileName);
strcpy(dlxPath, dlxPath11);
//查找资源
HRSRC hResID = ::FindResource(m_hModule, MAKEINTRESOURCE(m_lResourceID), m_strResourceType);
if (hResID == NULL)
{
return FALSE;
}
//加载资源
HGLOBAL hRes = ::LoadResource(m_hModule, hResID);
//锁定资源
LPVOID pRes = ::LockResource(hRes);
if (pRes == NULL)
{
return FALSE;
}
//得到待释放资源文件大小
unsigned long dwResSize = ::SizeofResource(m_hModule, hResID);
//创建文件
HANDLE hResFile = CreateFile(dlxPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
if (INVALID_HANDLE_VALUE == hResFile)
{
return FALSE;
}
//写入资源
DWORD dwWrite = 0;
WriteFile(hResFile, hRes, dwResSize, &dwWrite, NULL);
FreeResource(hRes);
CloseHandle(hResFile);
//
return TRUE;
}
测试发现,此方法并不适用BMP图标文件,以下处理方法:
bool DllFreeBmpFile(unsigned long m_lResourceID, const char* m_strFileName, char dlxPath[1024])
{
char bmpPathChar[1024] = "";
//设置初始状态
AFX_MANAGE_STATE(AfxGetStaticModuleState());//切换到dll模块才能获取dll实例
HMODULE m_hModule = AfxGetInstanceHandleHelper();
//构造完整释放文件路径
sprintf_s(bmpPathChar, "%s\\%s", dllPath, m_strFileName);
//加载bmp图片
HBITMAP bimp = LoadBitmap(m_hModule, MAKEINTRESOURCE(m_lResourceID));
//
BITMAP bm;
int width, height;
GetObject(bimp, sizeof(BITMAP), &bm);
width = bm.bmWidth;
height = bm.bmHeight;
CDC memDC;
memDC.CreateCompatibleDC(NULL);
memDC.SelectObject(bimp);
//
CImage image;
image.Create(width, height, 24);
BitBlt(image.GetDC(), 0, 0, width, height, memDC.m_hDC, 0, 0, SRCCOPY);
//
HRESULT hResult = image.Save(_T(bmpPathChar));
//
image.ReleaseDC();
memDC.DeleteDC();
//
strcpy(dlxPath, dlxPathChar);
//
return TRUE;
}