UpdateResource -> Icon, exe

Nob

Mitglied
Hallo erstmal.

Ich möchte das Icon einer meiner (kompilierten) Exe ändern, habe es aber bis jetzt nicht hinbekommen. Schön wäre es wenn ich dann auch noch andere Resourcen hinzufügen resp. ändern könnte.

Mein bisheriger Ansatz war:

BeginUpdateResource();
UpdateResource();
EndUpdateResource();

Ich denke ich bin auf dem richtigen Weg, leider hab ich aber keine Beispiele gefunden und selber hab ichs nicht geschafft.

Hat jemand ein Beispiel für mich? Wie funktioniert das?

Bin für jede Hilfe Dankbar.
 

code404

Mitglied
Also wenn du das Icon oben rechts in der Ecke meinst:
Im Resourceneditor in den Ordner Icon. Dort kannst du auch weitere Icons hinzufügen.

Gruß
 

Nob

Mitglied
Hallo
Danke, leider kenn ich den Artikel schon aber er hat mir nicht weitergeholfen..

Ich habe mir jetzt nocheinmal Zeit genommen aber ich verstehe es leider immer noch nicht ... :(

Was wird hier genau gemacht? Und auf was muss ich achten? Wie wird z.B. das Icon ersetzt?

HANDLE hFile;
DWORD dwFileSize,
dwBytesRead;
LPBYTE lpBuffer;

hFile = CreateFile(L"C:\\Winnt\\System32\\calc.exe", GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if (INVALID_HANDLE_VALUE != hFile)
{
dwFileSize = GetFileSize(hFile, NULL);

lpBuffer = new BYTE[dwFileSize];

if (ReadFile(hFile, lpBuffer, dwFileSize, &dwBytesRead, NULL) != FALSE)
{
// do something with lpBuffer here
}

delete [] lpBuffer;

CloseHandle(hFile);
}


HANDLE hResource;

hResource = BeginUpdateResource(L"C:\\...\\t3.exe", FALSE);
if (NULL != hResource)
{
if (UpdateResource(hResource,
RT_RCDATA,
MAKEINTRESOURCE(104),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPVOID) lpBuffer,
dwFileSize) != FALSE)
{
EndUpdateResource(hResource, FALSE);
}
}


HMODULE hLibrary;
HRSRC hResource;
HGLOBAL hResourceLoaded;
LPBYTE lpBuffer;

hLibrary = LoadLibrary(L"C:\\...\\t3.exe");
if (NULL != hLibrary)
{
hResource = FindResource(hLibrary, MAKEINTRESOURCE(104), RT_RCDATA);
if (NULL != hResource)
{
hResourceLoaded = LoadResource(hLibrary, hResource);
if (NULL != hResourceLoaded)
{
lpBuffer = (LPBYTE) LockResource(hResourceLoaded);
if (NULL != lpBuffer)
{
// do something with lpBuffer here
}
}
}

FreeLibrary(hLibrary);
}


DWORD dwFileSize,
dwBytesWritten;
HANDLE hFile;

dwFileSize = SizeofResource(hLibrary, hResource);

hFile = CreateFile(L"C:\\Winnt\\Temp\\calc2.exe",
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);

if (INVALID_HANDLE_VALUE != hFile)
{
WriteFile(hFile, lpBuffer, dwFileSize, &dwBytesWritten, NULL);

CloseHandle(hFile);
}
 

Endurion

Erfahrenes Mitglied
Das File-Gelese und Geschreibe ganz oben und unten ist irgendwie Quatsch, das hat nichts mit dem Ressourcen-Update zu tun. Was für dich wichtig ist:

In dem UpdateResource-Aufruf wird ein Resourcen-Typ angegeben (in dem Beispiel RT_RCDATA), für ein Icon müsste da RT_ICON eingesetzt werden.

Als Datenblock kannst du da allerdings nicht einfach ein HICON nehmen, sondern musst den kompletten Aufbau eines Icons im Speicher übergeben. In den Tiefen der MSDN ist der Aufbau beschrieben: User Interface Design and Development -> User Interface Design & Usability -> Technical Articles -> Icons in Win32
 

Nob

Mitglied
Super danke! Jetzt weiss ich was relevant ist!
Habe es gleich versucht.
Leider ist die hResource NULL. Sollte doch nicht so sein oder?
Hier mein code...


HMODULE hLibrary;
HRSRC hResource;
HGLOBAL hResourceLoaded;
LPBYTE lpBuffer;
DWORD dErrorCode;

hLibrary = LoadLibrary("C:\\Projects\\ResourceUpdateTest\\Release\\ResourceUpdateTest.exe");
if (NULL != hLibrary)
{
// habe statt IDI_ICON auch MAKEINTRESOURCE(129) versucht
hResource = FindResource(hLibrary, "IDI_ICON", RT_ICON);

if (NULL != hResource)
{
hResourceLoaded = LoadResource(hLibrary, hResource);
if (NULL != hResourceLoaded)
{
lpBuffer = (LPBYTE) LockResource(hResourceLoaded);
if (NULL != lpBuffer)
{
// do something with lpBuffer here
}
}
}else{
dErrorCode = GetLastError();
}

FreeLibrary(hLibrary);
}

ErrorCode = 1814
The specified resource name cannot be found in the image file. ERROR_RESOURCE_NAME_NOT_FOUND


So weit bin ich doch ned mehr davon entfernt oder?

Gruss & Danke
 

Endurion

Erfahrenes Mitglied
Ich meine, bei FindResource bist du besser beraten, wenn du den Zahlenwert direkt eingibst. Ist denn 129 der Wert der Resource in der Datei? Texte machen da nur Sinn, wenn die auch wirklich mit einem Textbezeichner in der Datei angelegt worden sind. Diese ID.. Defines sind KEINE Textbezeichner.

Besorg dir mal das Freeware-Tool ResHacker, da kannst du die Resourcen einer exe oder dll aufmachen, speichern und sogar abändern. Da kannst du prüfen, wie die Resourcen innerhalb deiner Test-Exe numeriert sind.

Ach ja, ansonsten sieht dein Code da sauber aus.
 

leon_20v

Erfahrenes Mitglied
ich weiß der thread ist uralt, aber ich stehe vor dem gleichen problem und hier ist nicht wirklich ne lösung gekommen. hat jemand eine?