V
wenn du das ganze selbst (ohne externe programme, also mit api funktionen) machen willst, ist das das richtige Forum und bitte hört auf hier rumzuspammen.
Das ist was ich dazu herausgefunden habe:
wenn man eine icondatei in eine pe-datei bekommen möchte, muss man alle im icon enthaltene bilder seperat als iconresource hinzufügen und eine icongruppe erstelen, die diese bilder referenziert.
Die schlüsselbefehle hierzu sind:
BeginUpdateResource
UpdateResource (jeweils einmal pro im icon enthaltenen bild mit RT_ICON als 2. parameter)
UpdateResource (mit RT_GROUP_ICON als typ um zu definieren, welche bilder zu dieser iconresource gehören)
EndUpdateResource
Allerdings habe ich es weder hinbekommen, die einzelnen iconsbilder zu kopieren, und auch nicht die gruppe richtig anzulegen.
Wenn ich mir das File mit einem ressourceneditor anschaue, sieht das ganze komisch aus.
Vielleicht kann mal jemand ein bespiel posten.
hier mal mein Code:
(das anze sollte ein programm werden, dass eine exe erzeugt, die ein anderes Prgramm mit bestimmten parametern startet.
Der zu erzeugende launcher ist als ressource in diesem Programm und wird als eigene Datei abgespeichert und anschließend sollen dessen ressourcen angepasst werden (eigenes Icon, zu startendes Program, Programparameter)
createLauncher.exe myprogLaunch.exe myicon.ico myProg.exe /abc '.'
erzeugt also eine kleine launcher Anwendung (name: myprogLaunch.exe, symbol: myicon.ico), die das Programm myProg.exe mit den Parameter /abc aufruft und das ausführungsverzeichnis auf '.' setzt.
Wichtig ist eigendlich nur der Teil zwischen BeginUpdateResource und EndUpdateResource
// CreateLauncher.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "windows.h"
#include "resource.h"
#pragma pack(push, 2)
struct IconFileDirEntry
{
BYTE Width; ///< width of image
BYTE Height; ///< height of image
BYTE Colors; ///< 0 means 256 or more
BYTE Reserved; ///< reserved
WORD Planes; ///< number of planes
WORD BitsPerPixel; ///< bits per pixel
DWORD ImageSize; ///< size of image data
DWORD ImageOffset; ///< offset of image data inside file
};
struct IconFile
{
WORD Reserved; ///< reserved
WORD Type; ///< 1 means icon, 2 means cursor
WORD ImageCount; ///< number of images stored inside the file
IconFileDirEntry IconDir[0];
};
struct IconGroupDirEntry
{
BYTE Width; ///< width of image
BYTE Height; ///< height of image
BYTE Colors; ///< 0 means 256 or more
BYTE Reserved; ///< reserved
WORD Planes; ///< number of planes
WORD BitsPerPixel; ///< bits per pixel
DWORD ImageSize; ///< size of image data
WORD ImageResID; ///< Resource ID of image
};
struct IconGroup
{
WORD Reserved; ///< reserved
WORD Type; ///< 1 means icon, 2 means cursor
WORD ImageCount; ///< number of images stored
IconGroupDirEntry IconDir[0];
};
int _tmain(int argc, _TCHAR* argv[])
{
//if(argc<5)
// printf("usage: CreateLauncher.exe outFile iconfilename programname programparam programExDir\n");
HRSRC hResource;
HGLOBAL hResourceLoaded;
LPBYTE lpBuffer;
hResource = FindResource(NULL, MAKEINTRESOURCE(IDR_101), RT_RCDATA);
if (NULL != hResource)
{
hResourceLoaded = LoadResource(NULL, hResource);
if (NULL != hResourceLoaded)
{
lpBuffer = (LPBYTE) LockResource(hResourceLoaded);
if (NULL != lpBuffer)
{
DWORD dwFileSize,
dwBytesWritten;
HANDLE hFile;
dwFileSize = SizeofResource(NULL, hResource);
hFile = CreateFile(argv[1],
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE != hFile)
{
WriteFile(hFile, lpBuffer, dwFileSize, &dwBytesWritten, NULL);
CloseHandle(hFile);
HANDLE hSResource = BeginUpdateResource(argv[1],false);
HANDLE hiconFile;
DWORD dwFileSize,
dwBytesRead;
LPBYTE lpBuffer;
hiconFile = CreateFile(argv[2], GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE != hiconFile)
{
BOOL res;
dwFileSize = GetFileSize(hiconFile, NULL);
lpBuffer = new BYTE[dwFileSize];
if (ReadFile(hiconFile, lpBuffer, dwFileSize, &dwBytesRead, NULL) != FALSE)
{
IconFile* iconfile = (IconFile*)lpBuffer;
DWORD headerSize = sizeof(IconGroup) + iconfile->ImageCount * sizeof(IconGroupDirEntry);
IconGroup* iconGroup = (IconGroup*) new BYTE[headerSize];
iconGroup->Reserved = iconfile->Reserved;
iconGroup->ImageCount = iconfile->ImageCount;
iconGroup->Type = iconfile->Type;
for(int i=0; i< iconfile->ImageCount; ++i)
{
res = UpdateResource(hResource, RT_ICON, MAKEINTRESOURCE(i+1),
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
lpBuffer + iconfile->IconDir[i].ImageOffset,
iconfile->IconDir[i].ImageSize);
iconGroup->IconDir[i].BitsPerPixel = iconfile->IconDir[i].BitsPerPixel;
iconGroup->IconDir[i].Colors = iconfile->IconDir[i].Colors;
iconGroup->IconDir[i].Height = iconfile->IconDir[i].Height;
iconGroup->IconDir[i].ImageSize = iconfile->IconDir[i].ImageSize;
iconGroup->IconDir[i].Planes = iconfile->IconDir[i].Planes;
iconGroup->IconDir[i].Reserved = iconfile->IconDir[i].Reserved;
iconGroup->IconDir[i].Width = iconfile->IconDir[i].Width;
iconGroup->IconDir[i].ImageResID = i+1;
}
res = UpdateResource(hSResource, RT_GROUP_ICON, MAKEINTRESOURCE(200),
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),iconGroup,
headerSize );
delete[] iconGroup;
size_t s1Len = wcslen(argv[3]);
size_t s2Len = wcslen(argv[4]);
size_t s3Len = wcslen(argv[5]);
size_t stblSize = s1Len
+ s2Len
+ s3Len
+ 3* 2;
wchar_t* buff = new wchar_t[stblSize];
wchar_t* s1Start = buff;
wchar_t* s2Start = s1Start + 1 + s1Len+1;
wchar_t* s3Start = s2Start + 1 + s2Len+1;
wchar_t* s4Start = s3Start + 1 + s3Len+1;
s1Start[0] = s1Len + 1 ;
s2Start[0] = s2Len + 1 ;
s3Start[0] = s3Len + 1 ;
s2Start[-1] =0;
s3Start[-1] =0;
s4Start[-1] =0;
memcpy(s1Start+1, argv[3], s1Start[0]*sizeof(wchar_t));
memcpy(s2Start+1, argv[4], s2Start[0]*sizeof(wchar_t));
memcpy(s3Start+1, argv[5], s3Start[0]*sizeof(wchar_t));
UpdateResource(hSResource, RT_STRING, MAKEINTRESOURCE(1),
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), buff, stblSize*sizeof(wchar_t));
delete[] buff;
}
// delete [] lpBuffer;
CloseHandle(hiconFile);
}
EndUpdateResource(hSResource,false);
}
}
}
}
return 0;
}