CComVariant::SetByRef() problem



  • Hallo,

    ich sitze gerade an meiner GUI für mein projekt. ich versuche alle meine änderungen die ich über die GUI gemacht habe, in einer XML datei zu speichern. auf dem weg dahin, muss ich meine objecte daten in VARIANTs stecken.
    dafür nutze ich CComVariant, da smartpointer deutlich angenehmer sind, als pure VARIANTS.
    nun möchte ich meinem variant einen wert zuweisen, und nutze dafür

    CComVariant t_Value;
    t_Value.SetByRef(&p_pProto->Type.Tile.m_bAutotile);
    

    wobei m_bAutotile ein bool ist.
    nun folgt aber ein compiler error:

    1>c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\atlcomcli.h(2577) : error C2039: 'VT': Ist kein Element von 'ATL::CVarTypeInfo<T>'
    1> with
    1> [
    1> T=bool
    1> ]
    1> c:\users\anti-freak\documents\visual studio 2008\projects\antis-gameengine(arbeitsname)\mapeditor\databaseoutput.cpp(157): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void ATL::CComVariant::SetByRef<bool>(T 😉 throw()".
    1> with
    1> [
    1> T=bool
    1> ]
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\atlcomcli.h(2577) : error C2065: 'VT': nichtdeklarierter Bezeichner

    google spuckt nichts brauchbares aus.

    das ist die methode wo der error entsteht.

    template< typename T >
    	void SetByRef( _In_ T* pT ) throw()
    	{
    		Clear();
    		vt = CVarTypeInfo< T >::VT|VT_BYREF;
    		byref = pT;
    	}
    

    ich nutze vs2008 professional.

    mfg



  • m_bAutotileein

    template< typename T >
        void SetByRef( _In_ T* pT ) throw()
        {
            Clear();
            vt = CVarTypeInfo< T >::VT|VT_BYREF;
            byref = pT;
        }
    

    Was tut diese Zeile? Sehen wir uns das mal naeher an:

    vt = CVarTypeInfo< T >::VT | VT_BYREF;
    

    Offensichtlich gibt es einen Member VT* (vielleicht ein Skalar).
    Der Compiler wird mit der Fehlermeldung Recht haben (hat er meistens sowieso immer); Solange wir nicht CVarTypeInfo s Definition sehen, laesst sich ueber den Fehler keine weitere Aussage machen.

    ****** Wahnsinning aufschlussreiche Identifier/Klassennamen, die du da hast. 🙄 :D*

    Edit (P.S.): Den leeren throw -specifier wuerde ich weglassen. 😉
    Denn Clear() hast du wahrscheinlich nicht mit einem solchen Versehen.



  • du weißt, das die template funktion aus atlcomcli.h stammt, und nicht von mir ist?
    das ist nur die stelle wo mich der compiler hinführt 🙄

    deswegen bin ich weder an der benennung der member schuld, noch an dem leeren throw.



  • anti-freak schrieb:

    du weißt, das die template funktion aus atlcomcli.h stammt, und nicht von mir ist?

    Woher soll ich das wissen? Ich hasse VC++ und werde es nie benutzen. (und von da kommt das offensichtlich)

    Also, die Definition wenn ich bitten darf! 🙂



  • Was sein kann ist, dass du diese Funktion nicht mit bool als Template-Parameter generieren lassen darfst.

    Edit: Hier (http://msdn.microsoft.com/en-us/library/50hy3h2h(v=vs.80).aspx) ist die API-Referenz dazu. Sieht also doch mit bool in Ordnung aus...



  • Sone schrieb:

    Ich hasse VC++ und werde es nie benutzen. (und von da kommt das offensichtlich)

    Header kommen selten bis nie aus einem Compiler/einer IDE...

    @anti-freak: lies dir mal die Links in meiner Signatur durch und liefere uns dann Code + Fehlerbeschreibung mit der man dir auch helfen kann.



  • pumuckl schrieb:

    Sone schrieb:

    Ich hasse VC++ und werde es nie benutzen. (und von da kommt das offensichtlich)

    Header kommen selten bis nie aus einem Compiler/einer IDE...

    @anti-freak: lies dir mal die Links in meiner Signatur durch und liefere uns dann Code + Fehlerbeschreibung mit der man dir auch helfen kann.

    Im Endeffekt hat er das doch:

    CComVariant t_Value; 
        bool bb = false;
        t_Value.SetByRef(&bb);
    

    Es gibt halt einfach keine Spezialisierung von CVarTypeInfo für bool.



  • __cu schrieb:

    Im Endeffekt hat er das doch:

    Nö. Stichwort reduziertes compilierbares Beispiel...



  • Sone schrieb:

    Woher soll ich das wissen?

    Aber erstmal rumkacken...

    Nimm mal ein BOOL oder VARIANT_BOOL statt bool.



  • @pumuckle
    ich weiß ehrlich gesagt nicht, was dein problem ist. du willst eine genau fehler beschreibung? lies den ersten post...
    das ist das was der compiler ausspuckt, und was ich selbst als bekannte analyse habe.

    aber danke ein cast in "BOOL*" hat mir geholfen.
    hat sich damit erledigt.

    mfg



  • anti-freak schrieb:

    @pumuckle
    ich weiß ehrlich gesagt nicht, was dein problem ist. du willst eine genau fehler beschreibung?

    Vor Allem Code... mit den paar Fetzen die du geliefert hast muss man raten was da noch so stehen könnte. Aber diesmal hat der Schuss ins Blaue von Jockelx offenbar ja geholfen...



  • ich habs aufs wesentliche beschränkt...
    ich denke es bringt dir wenig, wenn ich dir die komplette funktion poste, weil es hakt eben nunmal nur an den zeilen die ich hier gezeigt habe.
    gut, ok, das es sich um eine ATL funktion handelt hätte ich dazu schreiben können.
    aber egal, ich will gar nicht rum diskutieren, ich hab ja mein problem gelößt.



  • anti-freak schrieb:

    ich habs aufs wesentliche beschränkt...
    ich denke es bringt dir wenig, wenn ich dir die komplette funktion poste, weil es hakt eben nunmal nur an den zeilen die ich hier gezeigt habe.

    Es will auch keiner ein 1000+ Zeilen langes Beispiel.

    Sinnvoll ist ein auf's Wesentliche reduziertes compilierbares Beispiel. Oft sind diese dann immer noch lange genug - in deinem Beispiel wären es aber gerade mal 10 oder 20 Zeilen mehr gewesen.


Anmelden zum Antworten