VT_I8 wert in in _variant_t setzen ?
-
Hi,
ich ärgere mich grad mit dieser konvertierung, hat da jemand nen tip ?
habe schon versucht es auch als string einzulesen oder mit __int64, aber irgendwie setzt er mir den wert nicht ! oder spuckt konvertierungsfehler_variant_t var; CComVariant OriginSessionID; OriginSessionID = 128506010025259999; var.ChangeType(VT_I8); var = OriginSessionID; hr = spConfig->SetValue(&MCNR_OriginSessionID, &var);THANXX
CU
-
Welcher Compiler? Was für eine Zielplatform?
_variant_t int __int64 wird ab _WIN32_WINNT >= 0x0501 unterstützt.
Siehe:#include <windows.h> #include <tchar.h> #include <stdio.h> #include <comutil.h> #ifdef _DEBUG #pragma comment(lib, "comsuppwd.lib") #else #pragma comment(lib, "comsuppw.lib") #endif int _tmain() { __int64 iVal = 0; // Is only supported if _WIN32_WINNT >= 0x0501! _variant_t var; var = iVal; _tprintf(_T("Typ-Ist: %d, Soll: %d\n"), V_VT(&var), VT_I8); // or: _variant_t var2; V_VT(&var2) = VT_I8; V_I8(&var2) = iVal; _tprintf(_T("Typ-Ist: %d, Soll: %d\n"), V_VT(&var2), VT_I8); }
-
thanx für die antwort.
ich benutze visual studio 2005 auf XP und das hier geht:_variant_t var2;
V_VT(&var2) = VT_I8;
V_I8(&var2) = iVal;
_tprintf(_T("Typ-Ist: %d, Soll: %d\n"), V_VT(&var2), VT_I8);und es kommt raus Typ-Ist: 20, Soll: 20.
CU
-
hmm jetzt kann ich es setzen und auslesen doch jedes mal wenn ich -> SetValue ausführe schmiert´s ab. obwohl MCNR_OriginSessionID einen VT_i8 wert erwartet
var.ChangeType(VT_I8); V_VT(&var) = VT_I8; V_I8(&var) = iVal; hr = spConfig->SetValue(&MCNR_OriginSessionID, &var);der debugger stoppt hier:
namespace _com_util { inline void CheckError(HRESULT hr) throw(...) { if (FAILED(hr)) { _com_issue_error(hr); } } }idee ?
thanx
-
Dann hat der COM-Server vermutlich eine Exception geworfen...
-
was heisst denn das ?
* * [T] - may appear in a TYPEDESC * * [P] - may appear in an OLE property set * VT_UI8 [T][P] unsigned 64-bit intkann es sein dass ich die OriginSessionID, gar nicht als CComVariant initialisieren
kann ?sowas geht
CComVariant OutputFormat; OutputFormat = 1; var.ChangeType(VT_UI4); var = OutputFormat; hr = acConfig->SetValue(&ELAACENC_Output_Format, &var);aber mit VT_I8 eben nicht (hier nimmt er mir die initialiserung von OriginSessionID gar nicht an)
error C2440: '=' : cannot convert from 'ATL::CComVariant' to 'LONGLONG'CComVariant OriginSessionID; OriginSessionID = 5465465454466; var.ChangeType(VT_I8); V_VT(&var) = VT_I8; V_I8(&var) = OriginSessionID; hr = spConfig->SetValue(&MCNR_OriginSessionID, &var);THANX
CU
-
CComVariant kann's halt nicht... COM kann's... vermutlich der Server aber auch nicht...
-
hmm langsam habe ich keinen bock ! argh
jetzt habe ich den variant typ auf VARIANT geändert und da frisst er das problemlos
nur gesetzt wird es auch nicht, vielleicht liegt´s an was anderem.muss mal schauen.VARIANT test; VariantInit(&test); test.vt = VT_I8; test.llVal = 128506456386999999; hr = spConfig->SetValue(&MCNR_OriginSessionID, &test); printf("value using I64d: %I64d\n", test.llVal);was ist der unterschied zwischen VARIANT und _variant_t ?
THANX anyway
-
_variant_t ist eine C++ Implementierung die auch das Convertieren usw. unterstützt. Für Deinen Fall brauchst Du es nicht!
-
also jetzt test ich sowas :
hr = spConfig->LoadFromRegistry(0x80000000, bx, TRUE); test.vt = VT_I8; test.llVal = 99944646464699; hr = spConfig->SetValue(&MCNR_OriginSessionID, &test); printf("value using I64d: %I64d\n", test.llVal); printf("value using I64d: %I64d\n", &test); test.llVal = spConfig->GetValue(&MCNR_OriginSessionID, &test); printf("value using I64d: %I64d\n", test.llVal); printf("value using I64d: %I64d\n", &test); VariantClear(&test); hr = spConfig->CommitChanges(&test); hr = spConfig->SaveToRegistry(0x80000000, bx,TRUE);und die Ausgabe ist:
value using I64d: 99944646464699
value using I64d: adressenblablavalue using I64d: 0
value using I64d: adressenblablaHat jemand ne idee warum der wert nicht gesetzt wird ?
CU
-
Liefert "GetValue" nicht irgendwas *zurück*?
Dann schau bitte nach *was*! (also V_VT), bevor Du auf einen Member zugreifst!Und greife bitte *nie* direkt auf irgendwas zu, sondern nimm bitte die V_-Macros!