002
11.06.2007, 14:31 Uhr
david-h
|
Das ist die Funktion die vom Benutzer aufgerufen werden soll:
C++: |
extern "C" RESOURCECOPIER_API bool CopyResources(char *szSourceFile, char *szTargetFile) { //Dll´s laden HMODULE hSourceLib = LoadLibraryExA(szSourceFile, NULL, DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE); g_hTargetLib = BeginUpdateResourceA(szTargetFile, TRUE);
if (hSourceLib == NULL || g_hTargetLib == NULL) { //Fehler beim Laden! MessageBox(NULL, L"Konnte eine der beiden Dll´s nicht laden!", L"Error", 0); return false; } //Typen der Resourcen auflisten EnumResourceTypesA(hSourceLib, (ENUMRESTYPEPROCA) EnumTypesFunc, 0);
return true; }
|
Hier ist EnumResourceTypes und EnumResourceNames:
C++: |
BOOL EnumTypesFunc( HMODULE hModule, LPCSTR lpType, LONG_PTR lParam) { if (lpType == MAKEINTRESOURCEA(2) || lpType == MAKEINTRESOURCEA(3) || lpType == MAKEINTRESOURCEA(1)) //Icons, Cursor und Bilder kopieren { EnumResourceNamesA(hModule, lpType, (ENUMRESNAMEPROCA) EnumNamesFunc, 0); } return true; }
BOOL EnumNamesFunc( HMODULE hModule, LPCSTR lpType, LPCSTR lpName, LONG_PTR lParam) { // Sprachen auflisten & Resource kopieren EnumResourceLanguagesA(hModule, lpType, lpName, (ENUMRESLANGPROCA)EnumLangsFunc, 0); return true; }
|
Und zu guter letzt die Callback-Funktion von EnumResourceLangs, die dann die Resource auch kopieren soll:
C++: |
BOOL EnumLangsFunc( HMODULE hModule, LPCSTR lpType, LPCSTR lpName, WORD wLang, LONG_PTR lParam) { HRSRC hResInfo = FindResourceExA(hModule, lpType, lpName, wLang); if (hResInfo == NULL) { MessageBoxA(NULL, "Konnte Resource nicht finden!", "Error", 0); return false; } HGLOBAL hResHandle; void *lpResData;
//Resource laden hResHandle = LoadResource(hModule, hResInfo); if (hResHandle == NULL) { MessageBoxA(NULL, "Konnte Resource nicht laden!", "Error", 0); return false; }
lpResData = LockResource(hResHandle); if (lpResData == NULL) { MessageBoxA(NULL, "Fehler beim locken der Resource!", "Error", 0); return false; }
//geladene Resource in Ziel-Dll speichern if (UpdateResourceA(g_hTargetLib, lpType, lpName, wLang, lpResData, SizeofResource(hModule, hResInfo)) == false) { MessageBoxA(NULL, "Konnte Resource nicht in die Ziel-Dll kopieren!", "Error", 0); return false; }
return true; }
|
Was ich oben vergessen habe zu sagen: Der Code kompiliert einwandfrei, er tut nur nicht das, was er soll. |