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 int
    

    kann 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: adressenblabla

    value using I64d: 0
    value using I64d: adressenblabla

    Hat 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!


Anmelden zum Antworten