Problem mit Einlesen von Datei als Resource
-
Moinmoin,
erstmal: Keine Ahnung in welches Forum, das am besten passt, seid mir nicht böse...
Grundsätzlich würde ich gerne wissen, ob es irgendwelche Stolpersteine gibt, die man nicht erwartet, wenn ich eine Datei (eigenes Dateiformat) als Resource einbinde.
Ich versuche folgendes:
Ich will in meine (VST-Plugin)-.dll Preset-Bänke als Resource abspeichern. Das Laden und Speichern von Presets über Dateien funktioniert ohne Probleme, und zwar wie folgt:
Im Prinzip hat jeder Preset-Eintrag einen "Entry"-String vorangestellt, dann folgt ein Integer mit der Länge des Eintrags und dann der Eintrag. Ich lese also zuerst die Länge des Eintrags ein, alloziere genug Speicher und kopiere dann den Eintrag in meinen allozierten Speicher. Danach überspringe ich mit meinem Lese-Pointer den Eintrag anhand der angegebenen Länge und lande beim nächsten "Entry"-String.Was jetzt aber beim Einlesen der Datei als Resource passiert ist folgendes: Ich lande manchmal mit meinem Lesepointer ein Byte VOR dem Entry-String.
Das Einlesen benutzt die selben Funktionen wie beim Laden aus einer normalen datei, nur das Bereitstellen der Rohdaten funktioniert natürlich anders.Ich poste extra keinen Quellcode. Meine Frage zielt nur darauf ab, ob ich beim auslesen von Resourcen Dinge beachten muss, die solch ein Problem verursachen könnten?
Vielen Dank und viele Grüße
Sören
-
Das beachtet?:
http://msdn.microsoft.com/de-de/library/ba9d5yh5(VS.80).aspx
-
Öhhhm?
Ich fürchte, dass ich da nichtmal weiß, was das mit meinem Thema zu tun hat. Sorry

Vielleicht kannst du mir kurz erklären, was du meinst?
Danke und Grüße
Sören
-
Ok, das wichtigste für dich:
By default, MFC uses the resource handle of the main application to load the resource template. If you have an exported function in a DLL, such as one that launches a dialog box in the DLL, this template is actually stored in the DLL module. You need to switch the module state for the correct handle to be used. You can do this by adding the following code to the beginning of the function:
Bedeutet, wenn du in einer DLL mit Resourcen-IDs arbeitest, dann musst du zunächst den Kontext umschalten, weil ansonsten versucht wird eine Resource-ID aus der main-exe zu laden. In der DLL musst du deshalb in jede Funktion, die mit DLL-Resourcen rumspielt
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));schreiben, um den Kontext zu wechseln.
-
Wie bindest Du die Ressource ein?
Wie ermittelst Du den Zeiger?
-
Hi!
Das ermitteln der eigentlichen Ressource ist kein Problem. Die Datei, die ich bekomme sieht auch fast so aus, wie ich sie erwarte. Aber eben nur fast, der Fehler scheint mitten in der Datei zu liegen... Manchmal funktioniert es auch. Scheint vom Inhalt der Daten abzuhängen. Wenn ich die Datei von der Festplatte lade, habe ich nie Probleme. Das ist ja das komische. Ich zweifle ja gerne an meine Parser-Funktion, aber warum funktioniert sie, wenn die Datei direkt von der HD gelesen wird?
Hier ist der Code für das ermitteln der Ressource:bool BankAdministrator::loadBank(int resourceId) { extern void* hInstance; HMODULE module = (HMODULE) hInstance; HRSRC hRes=::FindResource(module,MAKEINTRESOURCE(resourceId),RT_RCDATA); HGLOBAL hGbl=::LoadResource(module,hRes); LPVOID pv=::LockResource(hGbl); int size = SizeofResource(module, hRes); char * buffer = new char[size]; memcpy(buffer,pv,size*sizeof(char)); bool ret = parseBank(buffer); delete buffer; return ret; }Vielen Dank
Sören