在很多外挂的安装包中,并没有对话框和图标文件。好处就是文件少,也防止用户修改对话框中的属性,导致程序异常。以下为大家提供一个方法,仅供参考:
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) { uc1601("1", 1); return FALSE; } //加载资源 HGLOBAL hRes = ::LoadResource(m_hModule, hResID); //锁定资源 LPVOID pRes = ::LockResource(hRes); if (pRes == NULL) { uc1601("2", 1); 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) { uc1601("3", 1); 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; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)