NXUG二次开发-其他-打包对话框图标到DLL

NXUG二次开发-其他-打包对话框图标到DLL,第1张

NX/UG二次开发-其他-打包对话框图标到DLL

在很多外挂的安装包中,并没有对话框和图标文件。好处就是文件少,也防止用户修改对话框中的属性,导致程序异常。以下为大家提供一个方法,仅供参考:

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;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5713684.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存