1,221
社区成员
发帖
与我相关
我的任务
分享
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;
}