Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Colevariant / Variant

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
29.07.2003, 08:17 Uhr
~Poirez
Gast


Hallo ich hätte da mal eine Frage, die mir vieleich jemand beantworten kann:

Weiss jemand, was man mit dem COleVariant alles so anstellen, und wie mann datentypen in den COleVariant konvertiert, oder umgekehrt.
Vieleicht kennst du ja eine Webseite oder weisst selbst was schlaues über denn COleVariant, oder einfach über den Datentyp VARIANT.

Danke vielmal!

Gruss Poirez
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.07.2003, 08:23 Uhr
virtual
Sexiest Bit alive
(Operator)



--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.07.2003, 08:47 Uhr
ao

(Operator)


Schau doch einfach mal in der MSDN-Hilfe nach. Im Index COleVariant eintippen und du landest an der richtigen Stelle. Wenn du danach noch Fragen hast, komm einfach wieder.

Ganz kurz: VARIANT ist ein Datentyp, der eine Variable von fast beliebigem Typ enthalten kann, also quasi die eierlegende Wollmilchsau. Eine Variable vom Typ VARIANT enthält Informationen darüber, von welchem Typ die enthaltene Variable ist (z.B. long, float, String, Array, ...) sowie diese Variable selbst. Damit ist VARIANT ein ziemlich universelles Werkzeug, nicht ganz einfach zu bedienen, aber sehr mächtig. Es spielt eine große Rolle bei der OLE-Automation, also bei der Steuerung von Programmen durch andere Programme.

COleVariant ist eine MFC-Schale, die VARIANT einkapselt und über Klassenmethoden leichter zugänglich macht.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.07.2003, 09:12 Uhr
0xdeadbeef
Gott
(Operator)


VARIANT und COleVariant sind der Teufel, weil du keine Typsicherheit hast. Du musst ständig überprüfen, was du eigentlich übergeben kriegst, und das ist natürlich unsicher und langsam. Benutz die Dinger nur, wenns wirklich nicht anders geht, und auch dann so selten wie möglich, sonst strotzt dein Code nachher nur so vor Heisenbugs.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 29.07.2003 um 09:13 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.07.2003, 09:19 Uhr
~Poirez
Gast


Erstmals danke für die Antworten

@Oxdeadbeef: Das habe ich selbst auch scho festgestelle, doch leider hat mir mein Lehrmeister den Auftrag erteilt, eine Dokumentation über diese beiden Dinger zu schreiben. :-(

@ao: Danke, ich hätte noch eine Frage: Habe habe gesehen, dass es in der Klasse COleVariant eine Funktion namens "Detach()" gibt, was bewirkt sie genau?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.07.2003, 09:28 Uhr
ao

(Operator)



Zitat:
0xdeadbeef postete
VARIANT und COleVariant sind der Teufel, weil du keine Typsicherheit hast. Du musst ständig überprüfen, was du eigentlich übergeben kriegst


Die sind ja auch nicht dafür da, daß man mit ihnen rechnet wie mit typsicheren Daten. Sie sind zum Datenaustausch über Schnittstellen gedacht, wenn erst zur Laufzeit feststeht, was eigentlich übertragen wird, oder wenn verschiedene Datentypen durch dieselbe Schnittstelle müssen.

Automation kennt keine Funktionsüberladung, also wenn du ein- und dieselbe Funktion nacheinander mit int, double und string-Werten füttern willst, brauchst du einen Datentyp, der das alles transportieren kann -> Variant eben.

Du machst dann ganz am Anfang die Typprüfung und kopierst danach den Wert um in ein internes typsicheres Objekt, und dann gehts weiter wie gewohnt.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.07.2003, 09:48 Uhr
ao

(Operator)



Zitat:
~Poirez postete
... "Detach()" ...

Normalerweise hat die umgebende COleVariant-Klasse die Kontrolle über das innere VARIANT, d.h. wenn der COleVariant zerstört wird, wird auch der VARIANT zerstört:


C++:
int func (void)
{
    COleVariant olevarName ("Fritz");
    /* hier mit "Fritz" arbeiten */

    return;
} /* hier wird olevarName durch ~COleVariant komplett zerlegt */



Nun ist eine wichtige Anwendung von COleVariant, Daten in Funktionen rein und wieder raus zu transportieren, und für den Weg nach draußen ist es wichtig, daß die Daten das Funktionsende überleben:


C++:
int GetName (VARIANT * pvarName)
{

    COleVariant olevarName;
    olevarName.Attach (*pvarName); /* olevarName uebernimmt die Kontrolle. */

    olevarName = "Fritz"; /* Bequemes Arbeiten mit Klassenmethoden */

    *pvarName = olevarName.Detach (); /* hiermit gibt olevarName die Kontrolle wieder ab, ~COleVariant wird den Namen nicht zerstoeren. */
}



ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
29.07.2003, 11:15 Uhr
0xdeadbeef
Gott
(Operator)


@ao: Ja, und dann hast du nachher Funktionen, die du lieber in mehrere gepackt hättest. So nach dem Motto:

C++:
void do_something(COleVariant v) {
    switch(v.vt) {
    case VT_R8:
        double d = v.dblVal;
        //do something
        break;
    case VT_BSTR:
        BSTR bs = v.bstrVal;
        //do something
        break;
    case VT_DISPATCH: //!!!
        //do something weird
        break;
     //und so weiter
    }
}


Ich weiß nicht, wies dir geht, aber wenn ich solchen Code sehe...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
29.07.2003, 12:01 Uhr
ao

(Operator)


Das sieht auf den ersten Blick sch... aus, da geb ich dir recht. Aber es gibt Situationen, da geht es nicht anders.

Automation ist gedacht für die Client-Server-Programmierung. Der Server bringt das Programmier-Interface mit, die Clients benutzen es. Das ist nicht irgendein Klassen-Header, den nur das eigene Programm sieht, oder vielleicht mal ein anderer C++-Programmierer. Das ist ein im ganzen System sichtbares Interface mit ein paar Randbedingungen:

1. Die Clients können in allen möglichen Sprachen geschrieben sein: C, C++, Basic, Java, Javascript, Python, Perl. Mit VARIANT kommen die alle klar.

2. Die Clients wollen ein "schönes" Interface, mit dem sie intuitiv arbeiten können. Der ganze Schweinkram-Code muß im Server stecken. Ein guter Server versteht, was der Client ihm sagen will, auch ohne eine ganze Latte von Funktionen wie do_something_with_float, do_something_with_string und so.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
29.07.2003, 12:09 Uhr
0xdeadbeef
Gott
(Operator)


Ein gut programmierter Server bietet für sowas eine C++-Schnittstelle mit einer Template

C++:
template <class _TDataType> do_something(_TDatatype bloss_kein_variant) {
    //...
}


die dann den Rest übernimmt. Es geht hier um Schnittstellendefiniton, nicht um das, was der Server intern macht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 29.07.2003 um 12:11 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: