VARIANT, msxml und die umwandlung
-
nunja, ich denke, der threadtitel ist ein wenig verwirrend, deswegen hier mal in etwas ausführlicherer form:
ich lese über msxml eine xml datei aus, und hole mir am ende den wert der attribute mit
get_nodeValue(&value);wobei hier "value" vom typ VARIANT ist. Ich weiß, das VARIANT ein union ist, aber ich kann nicht angeben, welchen typ ich gerne benutzen würde.
also wird am ende immer der typ "BSTR" beschrieben, was bisher auch kein größeres problem war, da ich es doch recht einfach in int, UINT oder was weiß ich umwandeln konnte.
nur jetzt kommt ein problem, das ich farben auslesen möchte, und diese in DWORD variablen speichern. allerdings funktioniert hier die übliche umwandlung per "atoi" oder "atol" nicht, da immer falsche werte bei der variable ankommen (beim steppen habe ich festgestellt, das value.bstr den richtigen wert enthält, also muss irgendwas bei der umwandlung schief laufen.
gibt es eine möglichkeit, dem parser mitzuteilen, das er eben den ULONG wert beschreiben soll, und nicht bstr?
oder kann mir jemand sagen, warum atol bei DWORD nicht funktioniert?mfg
-
keiner ne idee?
-
.
zu ungenau?ich wandle im moment noch so um:
UINT x = atoi(bstr_t(value));das funktioniert bestens, aber hier bekomme ich probleme
DWORD x = atol(bstr_t(value)); // value mit string 4278190080 für schwarz x hat danach dennoch den wert 2147483647ich habe schon daran gedacht, das es evntl ein variable überlauf ist, allerdings stimmt dann der wert immer noch nicht ganz.
mfg
-
Ich weiß, das VARIANT ein union ist, aber ich kann nicht angeben, welchen typ ich gerne benutzen würde.
also wird am ende immer der typ "BSTR" beschrieben, was bisher auch kein größeres problem war, da ich es doch recht einfach in int, UINT oder was weiß ich umwandeln konnte.da in einem union sich alle variablen den speicherplatz teilen, wird natürlch immer alles beschrieben.
kannst du VARIANT mal posten?es geht bestimmt auch via
variant_value.short_valbzw.variant_value.long_valetc. (natürlich werden die variablen kaum so heißen, aber sollte es ja verdeutlichen...)bb
-
du meinst die komplette structur?
das wäre dann das:
typedef /* [wire_marshal] */ struct tagVARIANT VARIANT; struct tagVARIANT { union { struct __tagVARIANT { VARTYPE vt; WORD wReserved1; WORD wReserved2; WORD wReserved3; union { LONGLONG llVal; LONG lVal; BYTE bVal; SHORT iVal; FLOAT fltVal; DOUBLE dblVal; VARIANT_BOOL boolVal; _VARIANT_BOOL bool; SCODE scode; CY cyVal; DATE date; BSTR bstrVal; IUnknown *punkVal; IDispatch *pdispVal; SAFEARRAY *parray; BYTE *pbVal; SHORT *piVal; LONG *plVal; LONGLONG *pllVal; FLOAT *pfltVal; DOUBLE *pdblVal; VARIANT_BOOL *pboolVal; _VARIANT_BOOL *pbool; SCODE *pscode; CY *pcyVal; DATE *pdate; BSTR *pbstrVal; IUnknown **ppunkVal; IDispatch **ppdispVal; SAFEARRAY **pparray; VARIANT *pvarVal; PVOID byref; CHAR cVal; USHORT uiVal; ULONG ulVal; ULONGLONG ullVal; INT intVal; UINT uintVal; DECIMAL *pdecVal; CHAR *pcVal; USHORT *puiVal; ULONG *pulVal; ULONGLONG *pullVal; INT *pintVal; UINT *puintVal; struct __tagBRECORD { PVOID pvRecord; IRecordInfo *pRecInfo; } __VARIANT_NAME_4; } __VARIANT_NAME_3; } __VARIANT_NAME_2; DECIMAL decVal; } __VARIANT_NAME_1; } ;und das aufrufen der einzelnen elemente habe ich ja auch schon probiert, aber da die typen sich
1. grundlegend unterscheiden (string und int passen nicht)
und 2. die typen nicht gleich groß sind
kann man das eigentlich auch vergessen, wenn das gewünschte element nicht expliziet beschrieben wird.
-
Ich denke, das ist eigentlich ein Thema fürs Winapi-Unterforum. Schau die mal VariantChangeType bzw. _wtoi64 an.
-
ok, danke, variantchangetype war der richtige schubs in die gewollte richtung

ich gehe davon aus, dass das nutzen von variantchangetype billiger ist als das 2. malige casten durchatoi(bstr_t(value));sehe ich das richtig so?
-
ja