Ressourcen entpacken
-
WebFritzi schrieb:
Sehe ich das richtig, dass ein C-Cast folgendes macht:
Nicht ganz. Wie ich bereits schrieb, tut er, je nach Kontext, das, was static_cast, reinterpret_cast oder const_cast machen:
int i = 1; const char* s = "ein String"; double f = (double) i; // entspricht static_cast <double> (i) int* pi = (int*) &f; // entspricht reinterpret_cast <int*> (&f) char* s2 = (char*) s; // entspricht const_cast <char*> (s)Mit dem C++-Cast ist es also möglich, eine bestimmte Cast-Art zu erzwingen, wodurch er wesentlich differenzierter eingesetzt werden kann - man sieht z.B. an der Verwendung eines reinterpret_cast zumeist, daß es sich um implementierungsabhängige Operationen handelt, am static_cast, daß eine gewöhnliche, recht harmlose Castoperation vorliegt und am const_cast, daß entweder der Programmierer Designfehler eingebaut oder mit solchen umzugehen hat.
WebFritzi schrieb:
Wenn ja, sehe ich nicht,w as daran verwerflich sein sollte, solange ich weiß, was im Speicher vor sich geht.
Es ist genausowenig verwerflich, globale Variablen, öffentliche Member, Makros etc. zu verwenden, wenn man genau weiß, was vor sich geht. Das ändert nichts an der Tatsache, daß all diese Dinge, Casts und insbesondere C-Casts eingeschlossen, Code unübersichtlicher machen, die Wartung des Codes durch Dritte (oder durch dich selbst nach zu langer Zeit) erschweren, schwer auffindbare Fehler und Bugs hervorrufen, bei der Portierung eines Programmes unerklärlicherweise fehlschlagen.
-
Ich kan dem was audacia geschrieben hat nur zu 100% zustimmen.
Per Definition sind C casts in unserer Firma untersagt.
-
@audacia: Vielen Dank für deine ausführliche Erklärung. Entspricht dann
Typ2 b = reinterpret_cast<Typ2>(a);dem hier:
Typ2 b = *(Typ2*)&a;???
Und was ist das Verhalten von dynamic_cast in der Dprache der C-Casts?
-
WebFritzi schrieb:
was ist das Verhalten von dynamic_cast in der Dprache der C-Casts?
Einen dynamic_cast gibt es in C (logischerweise) nicht, da der für polymorphe Objekte (Typen) ist (
C++, Stichwort: RTTI). Du kannst zwar auch einen C-Cast (Type) verwenden, aber da gibt es keine Prüfung zur Laufzeit, ob der Cast erfolgreich ist.
Scheiße
. Dieser wird verwendet um in Klassenhierarchien sichere (also kontrollierte) Downcasts durchzuführen.EDIT: Quote gefixt.
-
Ah, danke.

-
leuts, wo ihr schonmal dabei seid das thema so auszubreiten, ich will nochne .dll mitlinken (das ist ja net das prob) sondern das laden, wie soll das gehen (also von der .dll aus ressourcen)
also wenn die .dll die ich brauche net im selben ordner oder in system32 liegt kanns prog net gestartet werden.
also geht das überhaupt? wenn ja, wie?
-
Du könntest der DLL die HINSTANCE mitgeben. Das ist ja alles, was man braucht, um Resourcen zu laden.
-
Ich weiss ja nicht wie das geht, zum 3ten oder 4ten mal hier, ich habe von winapi fast keine ahnung, fenster und buttons bekomme ich hin und winsock, das wars auchschon...
nen kleiner code snippet wäre hilfreich
mfg
-
WebFritzi schrieb:
Entspricht dann
Typ2 b = reinterpret_cast<Typ2>(a);dem hier:
Typ2 b = *(Typ2*)&a;???
Ebenfalls nicht ganz. Der reinterpret_cast achtet darauf, daß die Typen, auch wenn ihm die Konvertierung mißfällt, zumindest die gleiche Größe haben, was du mit dem Zeigercast umgehst. Dadurch sind auch Dinge möglich wie
int i; double pd = *((double*) &i);. Mit einem direkten reinterpret_cast geht das nicht (der Zeiger läßt sich allerdings ebenso reinterpret_casten).
-
Martin Richter schrieb:
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.
Nein, LockResource sieht in Win32 so aus:
PVOID LockResource(HGLOBAL hGlob) { return (PVOID) hGlob; }