VARIANT Datentyp????



  • stimmt, hast recht 🙂
    Habe nicht auf Anhieb verstanden was der Code macht, also dieses COleVariant


  • Mod

    Es kapselt einen VARIANT und sorgt auch dafür, dass dessen interner Speicher freigegeben wird. Und es hat entsprechende typsichere Konstruktoren...

    Ich bevorzuge CCoVariant, ist aber Geschmacksache.



  • Der Tipp mit dem VT_ERROR kam mir wie gerufen!

    Es kapselt einen VARIANT ...

    Ja das dachte ich bisher auch. Aber es muss trotzdem Unterschiede geben.

    Verwende ich bei meiner WordAutomation die COleVariant funktioniert es nur mit den Original-Klassen aus der TypeLibrary. In meiner abgeleiteten Automations-Klasse bekomme ich die

    COleException: scode = severity: SEVERITY_ERROR, facility: FACILITY_NULL ($C0000005).

    Zu Deutsch "Keine Fehlermeldung verfügbar"
    Nehme ich dort VARIANT geht alles. Aber es ist mir echt zu mühsam, für jeden der zig Parameter den entsprechenden VARIANT zu bilden.

    Weiß jemand, woran es liegen kann, dass VARIANT aber nicht COleVariant funktioniert?


  • Mod

    Wahrscheinlich werden nicht die korrekten Typen gebildet und Du verwendest evtl. falsche KOnstruktoren.
    Zeig mal Code wie Du die VARIANTs baust und wie Du das mit COleVariant machst.
    BTW: Ich mag CComVariant lieber...



  • also ich habe mir die ganze Sache jetzt mal ein wenig betrachtet.
    Habe nun folgenden Code und versuche so ein bisschen mit dem ActiveX Modul rumzuspielen und will das irgendwan mal verstehen *g*

    void CWrenchServerDlg::OnErrorSocketwrench4(const VARIANT& ErrorCode, const VARIANT& Description)
    {
    	CComVariant Err_Code = ErrorCode;
    	CComVariant Err_Descr = Description;
    	CComBSTR* teststring;
    
    	BstrFromVector(teststring, ErrorCode);
    
    	MessageBox(_T("hier die description"),_T("hier der errorcode"),MB_OK);
    
    }
    

    Will im Prinzip aus dem Eventhandler Errorcode und Description ausgeben. Aber so ganz steig ich noch nicht durch. beim aktuellen Code kommt

    Fehler 1 error C2664: 'BstrFromVector': Konvertierung des Parameters 1 von 'ATL::CComBSTR *' in 'SAFEARRAY *' nicht möglich c:\dokumente und einstellungen\basti\eigene dateien\visual studio 2005\projects\wrenchserver\wrenchserver\wrenchserverdlg.cpp 216

    Und was ist ein "Event sink"? Und hat jmd. evtl. nen guten Link zu nem Text der sich mit COM Programmierung befasst, weil ich nicht UNBEDINGT auf die SocketWrench API zurückgreifen möchte.
    Liebe Grüße und Danke für die Hilfe
    Basti



  • Wahrscheinlich werden nicht die korrekten Typen gebildet und Du verwendest evtl. falsche Konstruktoren.

    Komplizierte Datentypen habe ich (zumindes im Open) gar nicht drin.

    Edit: ich nehm das mal hier raus. Hat ja nichts mit der Ursprungsfrage zu tun.


  • Mod

    Dieser Code ist Irrsinn!

    EigeneWordDocuments doc = wordApp->get_Documents());
        doc.Open(LPCTSTR(docName));
    

    Wie kannst Du einen LPDISPTACH Zeiger als LPCTSTR casten?
    Welchen Sinn soll das haben?

    Das umkopieren in einen neuen VARIANT ob nun CComVaiant oder COleVarient nützt nichts.
    Du musst entsprechende dem Typ in dem Variant Deine nachricht anzeigen.



  • Wie kannst Du einen LPDISPTACH Zeiger als LPCTSTR casten?

    Wieso? docName ist ein const char *

    Du musst entsprechende dem Typ in dem Variant Deine nachricht anzeigen.

    Wie meinst Du dass?



  • Hmm... mir erschliesst sich leider noch nicht genau wie mir das hilft, kann es vllt. genauer erläutern was geschehen muss und den Code erklären?


  • Mod

    Sorry wegen docName! Habe ich irgendwie überlesen.
    Aber warum castest Du dann bitte?
    Meide casts, wenn ein cast nötig ist überlege 3mal warum!

    Hast Du Dir mal angesehen, was ein VARIANT ist?
    Ein VARIANT ist variant, d.h. er kann ein INT enthalten einen BSTR, ein LONG ein BYTE, ein Array...

    Du musst also entsprechende des Typs im VARIANT reagieren, oder den Typ umwandeln in das was Du möchest VariantChangeType!



  • Sebastian, hast recht, dir hilft das sicher nicht weiter.

    Mein Problem ist, man hat mir fertigen Uralt-Quellcode vorgesetzt, den ich nun anpassen und erweitern muss. Momentan kämpfe ich mit den OLE-Grundlagen und habe dies hier beim Suchen nach COleVariant gefunden.



  • Aber warum castest Du dann bitte

    Ach frag mich nicht (s. letzten Beitrag).

    Du musst also entsprechende des Typs im VARIANT reagieren

    Ich dachte, das hätte ich, zumindest mit dem VARIANT (varFalse.boolVal=false; varFile.bstrVal=...). Aber COleVariant ist mir immer noch schleierhaft. Na vielleicht habe ich' s bis Montag kapiert.

    Ich klinke mich jetzt lieber aus und "studiere" erst mal Microsoft.



  • hehe okay, aber was muss ich jetzt an meinem Code ändern dass ich die 2 Daten in einer Messagebox ausgeben kann?! 😞
    Gruß Basti



  • Ich habs! Danke Martin für den Denkanstoß.

    COleVariant(docName)
    

    wars. Manchmal ist man doch besch...


  • Mod

    sebastian87 schrieb:

    hehe okay, aber was muss ich jetzt an meinem Code ändern dass ich die 2 Daten in einer Messagebox ausgeben kann?! 😞
    Gruß Basti

    Was bekommst Du denn übergeben?
    Jetzt sag nicht VARIANTs... :xmas1:



  • Naja im Prinzip wird an den Eventhandler OnError die 2 Variants übergeben die den errorcode und die description enthalten. Wie ich mit den Daten nun weiter verfahren muss um die wichtigen informationen auszulesen weis ich leider nicht und dummerweise auch nicht wie die generiert werden. hab einfach nur auf dem Dialogfeld rechtsklick auf das OCX gemacht und dan eben Eventhandler hinzufügen...:

    void CWrenchServerDlg::OnErrorSocketwrench4(const VARIANT& ErrorCode, const VARIANT& Description)
    {
    	CComVariant Err_Code = ErrorCode;
    	CComVariant Err_Descr = Description;
    	CComBSTR* teststring;
    
    	BstrFromVector(teststring, ErrorCode);
    
    	MessageBox(_T("hier die description"),_T("hier der errorcode"),MB_OK);
    
    }
    


  • Wenn du nichts weiter willst, als ErrorCode und Description in einer MessageBox anzuzeigen, musst du den vt Member überprüfen - er sagt dir, welchen Datentyp der Variant beinhaltet (siehe auch: http://msdn2.microsoft.com/en-us/library/ms221627.aspx)

    Angenommen ErrorCode ist vom Typ int, dann könnte das ganze so aussehen:

    CComVariant Err_Code = ErrorCode;
    CComVariant Err_Descr = Description;
    CComBSTR* teststring;
    CString strDescription, strErrorCode;
    
    BstrFromVector(teststring, ErrorCode);
    
    if(Description.vt == VT_BSTR)
    {
       strDescription.Format(_T("%S"), Description.bstrVal);		
    }
    
    if(ErrorCode.vt == VT_INT)
    {
        strErrorCode.Format(_T("%i"), ErrorCode.intVal);
    }
    
    MessageBox(strDescription, strErrorCode, MB_OK);
    

  • Mod

    Einfacher ist ein VariantChangeType (wie ich es scon schrieb) und dann direkt von dem entsprechenden Typ VT_BSTR auszugehen...


Anmelden zum Antworten