PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Icon-Transfer mit UpdateResource


Tom Servo
2003-10-20, 13:10:04
Hilfe,

ich möchte das Standard-Icon einer EXE auf eine andere EXE übertragen. Diese EXE dient als Launcher für die Original-EXE und soll deshalb deren Icon verwenden. Normale Windows-Verknüpfungen gehen nicht, da Parameter weitergereicht werden sollen.

Es würde erstmal reichen wenn es unter W2K/XP funktioniert. UpdateResource-API wäre deshalb ausreichend. Code in C/C++/C# wäre am besten. Habe hier das Delphi Programm ReplaceIcon2, was für mich schwer zu verstehen ist und leider auch gar nicht funktioniert mit meinem EXEs.

Leider gibts keinen fertigen funkionierenden Beispiel-Code über Google zu finden und ich beschäftige mich jetzt schon seit gestern damit ohne einer funktionierenden Lösung nahe gekommen zu sein.

Die Ziel-Exe baue ich selber und könnte also auch das dortige Icon mit Mustern präparieren und somit mit einfachen Dateifunkionen finden und ersetzen. Wäre vielleicht sogar am sinnvollsten und würde danna auch unter Win9x funktionieren. Weiss aber noch nichtmal genau wie ich dafür an die Icons der Quell-EXEs bekomme.

Mein Versuch mit UpdateResource sieht momentan so aus. Mit TRUE bei BeginUpdateResource() verschwindet immerhin das Original-Icon der Zieldatei.


char *src_file = "src.exe";
char *dst_file = "dst.exe";

void show_error() {
LPVOID lpMsgBuf;
DWORD lastError = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
lastError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);

MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
}


BOOL test() {
BOOL success = FALSE;
HINSTANCE hExe = LoadLibraryEx(src_file, NULL, LOAD_LIBRARY_AS_DATAFILE);
if(hExe) {
HRSRC hRes = FindResource(hExe, "#1", RT_ICON);
if(hRes) {
HGLOBAL hResLoad = LoadResource(hExe, hRes);
if(hResLoad) {
void* lpResLock = LockResource(hResLoad);
if(lpResLock) {
// API-Bug?: Martelli says BeginUpdateResource(dst_file, FALSE) may not work as documented
HANDLE hUpdateRes = BeginUpdateResource(dst_file, TRUE);
if (hUpdateRes) {
#define IDR_MAINFRAME 128
// API-Bug?: Martelli says resource names/types should not be strings
if (UpdateResource (hUpdateRes, RT_ICON,
MAKEINTRESOURCE(102), //MAKEINTRESOURCE(IDR_MAINFRAME),
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), lpResLock,
SizeofResource(hExe, hRes))) {
if (EndUpdateResource (hUpdateRes, FALSE)) {
success = TRUE;
} else show_error();
} else show_error();
} else show_error();
} else show_error();
} else show_error();
} else show_error();
FreeLibrary(hExe);
} else show_error();

return success;
}

// dead end. cannot do something useful with HICON.
BOOL test2() {
BOOL success = FALSE;
HINSTANCE hExe = LoadLibraryEx(src_file, NULL, LOAD_LIBRARY_AS_DATAFILE);
if (hExe) {
HICON hIcon = LoadIcon(hExe, MAKEINTRESOURCE(102));
if (hIcon) {
} else show_error();
FreeLibrary(hExe);
} else show_error();
return success;
}

Tom Servo
2003-10-21, 07:32:17
Scheinbar funktioniert das Delphi Programm nur dann nicht, wenn die Ziel-Exe keine Resourcen enthält. Dieses Manko von UpdateResource war auch bekannt. Beim ersten Test hatte ich das aber noch nicht gewusst.

Bleibt noch das Problem, dass IconReplace.exe als Quelle eine .ICO Datei nimmt und keine .EXE.

Sollte aber jetzt kein allzu grosses Problem mehr sein.