2010. 11. 9. 16:17
[개발/언어]
ico 파일이나 exe 파일의 리소스를 읽어서 exe의 아이콘을 변경하는 코드
#pragma pack(push, 2)
typedef struct {
WORD Reserved1;
WORD ResourceType;
WORD ImageCount;
BYTE Width;
BYTE Height;
BYTE Colors;
BYTE Reserved2;
WORD Planes;
WORD BitsPerPixel;
DWORD ImageSize;
WORD ResourceID;
} GROUPICON;
#pragma pack(pop)
void ChangeIconFromIco(LPCTSTR source, LPCTSTR target)
{
HANDLE hTarget = BeginUpdateResource(target, FALSE);
if (hTarget == NULL)
{
printf("BeginUpdateResource fail\n");
return;
}
char *buffer;
DWORD dwBytesToRead;
DWORD dwBytesRead;
HANDLE hFile;
hFile = CreateFile(source, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("INVALID_HANDLE_VALUE\n");
return;
}
dwBytesToRead = GetFileSize(hFile, 0);
buffer = (char *)malloc(dwBytesToRead);
ReadFile(hFile, buffer, dwBytesToRead, &dwBytesRead, 0);
CloseHandle(hFile);
if (UpdateResource(
hTarget,
RT_ICON,
MAKEINTRESOURCE(1),
MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN),
(buffer+22),
dwBytesToRead-22
) == FALSE)
{
printf("UpdateResource(RT_ICON) fail\n");
}
GROUPICON grData;
grData.Reserved1 = 0;
grData.ResourceType = 1;
grData.ImageCount = 1;
grData.Width = 32;
grData.Height = 32;
grData.Colors = 0;
grData.Reserved2 = 0;
grData.Planes = 2;
grData.BitsPerPixel = 32;
grData.ImageSize = dwBytesToRead - 22;
grData.ResourceID = 1;
UpdateResource(
hTarget,
RT_GROUP_ICON,
_T("MAINICON"),
MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN),
&grData,
sizeof(GROUPICON)
);
delete buffer;
if (EndUpdateResource(hTarget, FALSE) == FALSE)
{
printf("EndUpdateResource fail\n");
}
}
void ChangeIconFromExe(LPCTSTR source, LPCTSTR target)
{
HRSRC hRes;
HANDLE hUpdateRes;
char *lpResLock;
HRSRC hResLoad;
BOOL result;
HMODULE hSourceExe, hTargetExe;
int iLoop;
hSourceExe = LoadLibrary(source);
if (hSourceExe == NULL) return;
for (iLoop = 1;;iLoop++)
{
TCHAR str[100] = {0,};
_stprintf_s(str, 100, _T("#%d"), iLoop);
hRes = FindResource(hSourceExe, str, RT_ICON);
if (hRes == NULL)
continue ;
else if (iLoop == 10)
return;
else
break;
}
hResLoad = (HRSRC)LoadResource(hSourceExe, hRes);
if (hResLoad == NULL) return ;
lpResLock = (char*)LockResource(hResLoad);
if (lpResLock == NULL) return ;
hTargetExe = LoadLibrary(target);
if (hTargetExe == NULL) return;
for (iLoop = 1;;iLoop++)
{
TCHAR str[100] = {0,};
_stprintf_s(str, 100, _T("#%d"), iLoop);
if (FindResource(hTargetExe, str, RT_ICON) == NULL)
continue ;
else if (iLoop == 10)
break;
else
break;
}
FreeLibrary(hTargetExe);
hUpdateRes = BeginUpdateResource(target, FALSE);
if (hUpdateRes == NULL) return ;
result = UpdateResource(hUpdateRes,
RT_ICON,
MAKEINTRESOURCE(1),
MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN),
lpResLock,
SizeofResource(hSourceExe, hRes));
if (result == FALSE) return;
if (!EndUpdateResource(hUpdateRes, FALSE)) return;
}
'개발 > 언어' 카테고리의 다른 글
python 3.6 으로 변경 (0) | 2018.04.10 |
---|---|
C++ 을 빛내는 boost 라이브러리, 약간의 아쉬움. (7) | 2012.03.22 |
PHP에서 웹 페이지 내용 또는 헤더 값 가져오는 코드 (0) | 2011.01.10 |
어셈블러는 배울 가치가 있을까? (2) | 2008.01.10 |
GMail 제목 UTF-8 문제 해결 (파이썬 코드) (2) | 2007.03.15 |