Ressourcen entpacken
-
so, habe mir sagen lassen, das mein typ RT_RCDATA für RawData sein muss, und nix Custom oder FILE.
das mit hInst will immernochnicht (falsche typen hier, does not match da, usw. usf.).
Leute, ich suche schon seit mehreren tagen (schon alleine wie man dateien mitlinkt hat mich 2 tage gekostet)
das mit dem entpacken hab ich bist jetzt nochnet geschafft,...
Ich habe auchnoch anderes zu tun als nur mich dieser einen Sache zuzuwenden bin bin langsam völlig gernervt.
Ich weiss ja, man soll google benutzen, man soll die forum suche benutzen, etc pp. hat ich alles gemacht, ich habe seit mehr als 3 tagenfür das mitlinken und entpacken gesucht.
Sorry, dass ich einfach so "dreist" frage, aber kann mir nicht jemand ein fertiges beispiel (mit .rc file und resource.h) schreiben, was auch funktioniert?
Ich wäre sehr dankbar.
mfg
-
codeworx schrieb:
CodeFinder, ich habe deinen Code mal ausprobiert, aber da entsteht nur ne Endlosschleife.[...]
lol ?! hm klingt irgendwie unglaubwürdig, da da ja gar keine Schleife (explizit) verwendet wurde... . Was sagt Dir denn der Debugger ?
-
natürlich ist da ne schleife:
while(!kbhit());
Das Prog funzt wie es ist nicht bei mir.
Ich weis auch garnicht ob ic hdie ressourcen richtig im resource script (die .rc) datei richtig deklariert habe, oder ob das was in der resource.h steht richtig ist...
Ich will einfach nur nen kleinen resourcen entpacker, der die mitgelinkten ressourcen entpackt, mit möglichst wenig aufwand.
mfg
-
Mannomann...
// In bla.rc #include "resource.h" ID_MOD_02 BINARY "MyFile.xxx"#include <windows.h> #include "resource.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HRSRC hrsrc = FindResource((HMODULE)hInstance, MAKEINTRESOURCE(ID_MOD_02), "BINARY"); if(!hrsrc) MessageBox(NULL, "Could not find resource", "ERROR", MB_OK|MB_ICONERROR); LPVOID pData = (LPVOID)LoadResource((HMODULE)hInstance, hrsrc); if(!pData) MessageBox(NULL, "Could not load resource", "ERROR", MB_OK|MB_ICONERROR); return 0; }EDIT: Deine resource.h war schon OK. Du musst sie natürlich noch in bla.rc inkludieren (s.o.)
-
@webfritzi:
Warum castest Du hInstance? Das irritiert doch nur und ist Quelle für üble Fehler. Und wenn wäre höchstens ein static_cast hier erlaubt um diese Fehler zu vermeiden...
-
webfritzi ich liebe dich, ich will ein kind von dir^^ funzt 1a und das mit createfile und writefile konnte ich wie gehabt benutzen....
mfg
-
Martin Richter schrieb:
@webfritzi:
Warum castest Du hInstance? Das irritiert doch nur und ist Quelle für üble Fehler. Und wenn wäre höchstens ein static_cast hier erlaubt um diese Fehler zu vermeiden...
Deswegen:
codeworx schrieb:
das mit hInst will immernochnicht (falsche typen hier, does not match da, usw. usf.).
-
codeworx schrieb:
natürlich ist da ne schleife:
while(!kbhit());
Das Prog funzt wie es ist nicht bei mir.
Ich weis auch garnicht ob ic hdie ressourcen richtig im resource script (die .rc) datei richtig deklariert habe, oder ob das was in der resource.h steht richtig ist...
Ich will einfach nur nen kleinen resourcen entpacker, der die mitgelinkten ressourcen entpackt, mit möglichst wenig aufwand.
mfg
OMG! Ich rede von der Funktion die main-Funktion soll doch nur die Verwendung verdeutlichen! Dass das noch anzupassen ist, ist doch wohl klar.
-
Egal, CodeFinder. Du hast ihm nichts neues gegeben. Den Code hatte er doch (in etwa) auch schon.
-
Ne egal ist das nicht. Er soll ja auch verstehen, dass es mir um die Funktion ('ExtractReSrcFile') ging, nicht um die main
.
-
Ich denke, das war ihm klar. Mit seinem Statement wollte er nur ausdrücken, dass außer einer Endlosschleife da nicht viel passiert. Wie vorher halt auch schon.
-
WebFritzi schrieb:
Deswegen:
codeworx schrieb:
das mit hInst will immernochnicht (falsche typen hier, does not match da, usw. usf.).
Und das glaubst Du?
1. HMODULE==HINSTANCE siehe defines in windows.h. Der Code funktioniert bei mir ohne cast!
2. Überflüssige casts sind immer ein Problem
3. Jederr cast will sehr wohl überlegt sein.
-
Martin Richter schrieb:
Und das glaubst Du?
1. HMODULE==HINSTANCE siehe defines in windows.h.War zu faul nachzuschauen.

Martin Richter schrieb:
2. Überflüssige casts sind immer ein Problem
3. Jederr cast will sehr wohl überlegt sein.Mag so sein. Ich sehe es aber nicht so, weil ich noch nie (und damit meine ich auch NIE) Probleme mit Casts hatte. Ich verwende stets C-Casts.
-
ich mach das jetzt letzen endes so:
#include <windows.h>
#include "resource.h"int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
LPVOID ldata = LockResource(LoadResource(0,FindResource(0,MAKEINTRESOURCE(ID_MOD_02),"BINARY")));//tu irgendwas (bspweise mit ldata irgendwas anfangen (entpacken, mit anderen funktionen abspielen, ...
UnlockResource(ldata);
return 0;
}funzt 1a und bin glücklich, hat das denn so seine richtigkeit?
mfg
-
Naja, du solltest schon auf Fehler prüfen. Und UnlockResource() brauchst du nicht in Win32.
@Schlaue Leute: Wozu eigentlich das LockResource? Man kann doch auch das Handle von LoadResource nach LPVOID casten. Funzt doch auch.
-
WebFritzi schrieb:
Martin Richter schrieb:
2. Überflüssige casts sind immer ein Problem
3. Jederr cast will sehr wohl überlegt sein.Mag so sein. Ich sehe es aber nicht so, weil ich noch nie (und damit meine ich auch NIE) Probleme mit Casts hatte. Ich verwende stets C-Casts.
Das hat nix mit C oder C++ Casts zu tun: Da wo man ohne Casts auskommt, sollte man auch keine verwenden!
-
codeworx schrieb:
#include <windows.h>
#include "resource.h"int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
LPVOID ldata = LockResource(LoadResource(0,FindResource(0,MAKEINTRESOURCE(ID_MOD_02),"BINARY")));//tu irgendwas (bspweise mit ldata irgendwas anfangen (entpacken, mit anderen funktionen abspielen, ...
UnlockResource(ldata);
return 0;
}funzt 1a und bin glücklich, hat das denn so seine richtigkeit?
Nein! Ich würde immer das hInstance Handle übergeben! Weder LoadResource noch FindResource bekommen bei Dir das hInstance Handle!
Dieser Code würde in einem DLL-Modul kläglichst versagen.
-
WebFritzi schrieb:
@Schlaue Leute: Wozu eigentlich das LockResource? Man kann doch auch das Handle von LoadResource nach LPVOID casten. Funzt doch auch.
Erst LockResource mapped den entsprechenden Speicher ein. Wenn Du wenig Resourcen hast, sind die Seiten bereits im Speicher. Werden diese jedoch größer ist das nicht gewährleistet.
-
[quote="CodeFinder"]
WebFritzi schrieb:
Das hat nix mit C oder C++ Casts zu tun: Da wo man ohne Casts auskommt, sollte man auch keine verwenden!
Ich hasse Dogmen! Also, wenn du mir das nicht begründen kannst, sehe ich das nicht ein.
Martin Richter schrieb:
WebFritzi schrieb:
@Schlaue Leute: Wozu eigentlich das LockResource? Man kann doch auch das Handle von LoadResource nach LPVOID casten. Funzt doch auch.
Erst LockResource mapped den entsprechenden Speicher ein. Wenn Du wenig Resourcen hast, sind die Seiten bereits im Speicher. Werden diese jedoch größer ist das nicht gewährleistet.
Danke für die Aufklärung. Jetzt hab auch ich es kapiert.
-
WebFritzi schrieb:
Also, wenn du mir das nicht begründen kannst, sehe ich das nicht ein.
Ein paar einfache Gründe: Casts sind in vielen Fällen unnötig und blähen den Code übermäßig auf, wo es gar nicht nötig wäre. Zudem kann insbesondere der C-Cast, da er kontextsensitiv ist, je nach Fall ein static_cast, ein const_cast, ein reinterpret_cast oder gar mehrere zugleich sein - oft, obwohl man eigentlich nur einen static_cast oder implicit_cast wollte. => static_cast verwenden oder - wenn nicht nötig - gar nicht casten. Ein gutes C++-Programm sollte eigentlich mehrheitlich ohne Casts auskommen.
In diesem speziellen Fall halte ich den Cast allerdings - sofern du ihn als static_cast schreibst
- für vertretbar. Casten zwischen Handles ist, auch wenn es hier laut windows.h ausdrücklich nicht nötig ist, für gewöhnlich unerläßlich. Wer es nicht glaubt, definiere in den Compileroptionen mal das Präprozessorsymbol "STRICT". Und das hat auch fast immer seinen Grund - Handles sind wie Zeiger auf polymorphe Datentypen zu behandeln, und zwischen denen castet man ja auch nicht ohne weiteres herum.