为什么获取.exe图标存储为.icon文件颜色会失真以及如何确保获取存储的是主图标?

YJasper 2016-05-09 10:56:32
1)在获取.exe文件的图标存储为.icon文件时,部分图标会正常获取,部分图标颜色会失真,图标也会模糊。请问该怎么解决?是因为获取资源的尺寸参数缺省问题么?需要怎么修改?如:
2)下面的代码是我用来获得图标的方法,但是这样做会遍历该exe文件的全部图标(快捷方式里更改图标就会在文本框内显示所有图片),并最终保存最后一个图标(而这个图标可能不是系统在桌面上给我们展示的exe图标)。请问该用什么办法解决呢?去掉遍历过程么?
EnumResourceNames(hModule, RT_GROUP_ICON, (ENUMRESNAMEPROC)EnumIconProc, (LPARAM)&iconIndex);

BOOL CALLBACK EnumIconProc(HMODULE hModule,LPCTSTR lpszType,LPTSTR lpszName,LPARAM lParam)
{
HRSRC hRes = FindResource(hModule, lpszName, RT_GROUP_ICON);
if (hRes == NULL)
return TRUE;

HGLOBAL hGlobal = LoadResource(hModule, hRes);
if (hGlobal == NULL)
return TRUE;

LPVOID lpBuffer = LockResource(hGlobal);
if (lpBuffer == NULL)
{
FreeResource(hGlobal);
return TRUE;
}

DWORD dwSize = SizeofResource(hModule, hRes);

int nId = LookupIconIdFromDirectoryEx((PBYTE)lpBuffer,TRUE,SM_CXICON,SM_CYICON,LR_DEFAULTCOLOR); //SM_CXICON,SM_CYICON为缺省显示一般32*32

hRes = FindResource(hExe, MAKEINTRESOURCE(nId),MAKEINTRESOURCE(RT_ICON));
if (hRes == NULL)
return TRUE;

hGlobal = LoadResource(hExe,hRes);
if (hGlobal == NULL)
return TRUE;

lpBuffer = LockResource(hGlobal);
if (lpBuffer == NULL)
return TRUE;

dwSize = SizeofResource(hModule,hRes);

HICON hIcon = CreateIconFromResourceEx((PBYTE)lpBuffer,dwSize,TRUE,0x00030000,SM_CXICON,SM_CYICON,LR_DEFAULTCOLOR);
DWORD dwgle = GetLastError();
if(NULL == hIcon)
return TRUE;

HRESULT hr = SaveIcon(hIcon);

return TRUE;
}

HRESULT SaveIcon(HICON hIcon) {
// Create the IPicture interface
PICTDESC desc = { sizeof(PICTDESC) };
desc.picType = PICTYPE_ICON;
desc.icon.hicon = hIcon;
IPicture* pPicture = 0;
HRESULT hr = OleCreatePictureIndirect(&desc, IID_IPicture, FALSE, (void**)&pPicture);
if (FAILED(hr)) return hr;

// Create a stream and save the image
IStream* pStream = 0;
CreateStreamOnHGlobal(0, TRUE, &pStream);
LONG cbSize = 0;
hr = pPicture->SaveAsFile(pStream, TRUE, &cbSize);

// Write the stream content to the file
if (!FAILED(hr))
{
HGLOBAL hBuf = 0;
GetHGlobalFromStream(pStream, &hBuf);
void* buffer = GlobalLock(hBuf);
HANDLE hFile = CreateFile(SAVE_ICON_PATH, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
if (!hFile)
hr = HRESULT_FROM_WIN32(GetLastError());
else
{
DWORD written = 0;
WriteFile(hFile, buffer, cbSize, &written, 0);
CloseHandle(hFile);
}
GlobalUnlock(buffer);
}
// Cleanup
pStream->Release();
pPicture->Release();
return hr;

}

对这方面不太懂,SaveIcon是在网上找到的一些网友提供的思路方法。有些地方还不完全懂,如果是这部分的问题,还望各位详细说明下。谢谢各位。
...全文
190 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
YJasper 2016-05-11
  • 打赏
  • 举报
回复
还是没人理~~~
YJasper 2016-05-10
  • 打赏
  • 举报
回复
没人理。。。

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧