COM Schnittstelle und BSTR



  • Hallo,
    nochmal ein Versuch:
    Die Funktion ruft eine Funktion in der COM Schnittstelle clsWordConnector (=VisualBasic DLL) auf:

    FMX_PROC(fmx::errcode) DialogFileOpen (short funcId, const fmx::ExprEnv& environment, const fmx::DataVect& dataVect, fmx::Data& result)
    {
    		hr = CoCreateInstance( CLSID_clsWordConnector,
    			NULL,
    			CLSCTX_INPROC_SERVER,
    			IID__clsWordConnector, 
    			(void**) &IVBClass);
    
    		hr = IVBClass->[b]DialogFileOpen[/b]((BSTR*)&dataVect.AtAsText(0) , (BSTR*)&result);
        return 0;
    }
    

    interface clsWordConnector sieht in Ausschnitten so aus:

    EXTERN_C const IID IID__clsWordConnector;
    
    #if defined(__cplusplus) && !defined(CINTERFACE)
    
        MIDL_INTERFACE("13020D34-3675-4DB8-8815-4666896E02CF")
        _clsWordConnector : public IDispatch
        {
        public:
    
    ...
            virtual /* [id] */ HRESULT STDMETHODCALLTYPE [b]DialogFileOpen[/b]( 
                /* [out][in] */ BSTR __RPC_FAR *Parameter,
                /* [retval][out] */ BSTR __RPC_FAR *__MIDL_0032) = 0;
    ...
    }
    

    Der Aufruf des Interface funktioniert und auch der Compiler akzeptiert das.
    Aber ich bekomme keine Werte zurück und es kommen auch keine Werte in der Schnittstelle an.
    Die Schnittstelle sollte eigentlich ber Dialog als Test den Wert in dataVect ausgeben.

    Wenn ich das testhalber mit selber gebastelten Strings mache:

    _bstr_t bs1 = "testtest";      
    _bstr_t bs2;  
    
    hr = IVBClass->DialogBrowseFor((BSTR) &bs1, (BSTR*)&bs2);
    

    dann klappt das??
    Wo ist der Haken? Das hat was mit den Pointern und den Vectoren zu tun, denke ich.

    Hilfe, hilfe!!!
    Fons Gufler



  • Alsi ich persönlich würde hier nicht mit dem _com_bstr arbeiten.. sondern für die Parameter nur direkt einen BSTR... sonst gibt der _com_bstr vermutlich den Speicher zu viel oder zu wenig frei...
    Siehe:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcconstringsallocatingreleasingmemoryforbstr.asp

    Siehe auch: What are the rules for BSTR allocation and deallocation?
    http://www.codeguru.com/forum/showthread.php?t=364511



  • Oder kannst auch CString::SysAllocString verwenden



  • Servus Jochen,
    Danke schon mal für Deine/Eure Antworten! Komm leider nicht weiter.

    Jochen Kalmbach schrieb:

    Alsi ich persönlich würde hier nicht mit dem _com_bstr arbeiten.. sondern für die Parameter nur direkt einen BSTR... sonst gibt der _com_bstr vermutlich den Speicher zu viel oder zu wenig frei...

    FMX_PROC(fmx::errcode) MyFunction2 (short funcId, const fmx::ExprEnv& environment, const fmx::DataVect& dataVect, fmx::Data& result)
    {
    
    BSTR bstrParam = SysAllocString(dataVect.AtAsText(0));	
    ...
    }
    

    Mit dem BSTR probier ich es dauernd, gibt folgenden Err:
    error C2664: 'SysAllocString': Konvertierung des Parameters 1 von 'const fmx::Text' in 'const OLECHAR *' nicht möglich
    Das Problem ist der dataVect, da klappt die Umwandlung nicht.
    Any ideas???
    Fons Gufler



  • BSTR bstrParam = SysAllocString(CA2CW(dataVect.AtAsText(0)));
    


  • Jochen Kalmbach schrieb:

    BSTR bstrParam = SysAllocString(CA2CW(dataVect.AtAsText(0)));
    

    error C3861: 'CA2CW': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden

    Was muss ich da noch einfügen und wie schreib ich dann die Deklaration?
    Fons



  • Was für eine Version von VS? VC7 oder später?

    #include <atlbase.h>
    #include <atlconv.h>
    


  • Jochen Kalmbach schrieb:

    Was für eine Version von VS? VC7 oder später?

    VC7
    Microsoft Visual C++ .NET 69589-706-0273621-18046

    Der Fehler bleibt!?
    error C3861: 'CA2CW': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden



  • Jochen Kalmbach schrieb:

    BSTR bstrParam = SysAllocString(CA2CW(dataVect.AtAsText(0)));
    

    Hallo,

    leider finde ich weder bei Google noch in der Help oder bei MSDN Hinweise zu CA2CW.
    Gruß
    Fons



  • ???: ATL and MFC String Conversion Macros
    http://msdn2.microsoft.com/library/87zae4a3.aspx



  • Jochen Kalmbach schrieb:

    ???: ATL and MFC String Conversion Macros
    http://msdn2.microsoft.com/library/87zae4a3.aspx

    Danke Jochen,
    das ist ja alles ganz "nett", aber für einen Anfänger undurchschaubar, finde ich.
    Gibts denn keinen konkreten Lösungsvorschlag, einen anständigen BSTR aus dem dataVect zu bauen:

    BSTR bstrParam = SysAllocString(dataVect.AtAsText(0));
    

    gibt wie gesagt Fehler zurück:
    error C2664: 'SysAllocString': Konvertierung des Parameters 1 von 'const fmx::Text' in 'const OLECHAR *' nicht möglich

    Vielleicht hilft ja die Klassendefinition von DataVect weiter:

    namespace fmx
        {
            class Text;
            class FixPt;
            class DateTime;
            class BinaryData;
        	class Data;
        	class DataVect;
        	class ExprEnv;
    
            FMX_PROCPTR( errcode, ExtPluginType ) ( short functionId, const ExprEnv& env, const DataVect& parms, Data& result );
    
            class DataVect
            {
            public:
                inline ulong Size () const;
                inline void Clear ();
                inline bool IsEmpty () const;
                inline void PushBack ( const Data &data );
                inline Data *PopBack ();
                inline const Data &At ( ulong position ) const;
                inline const Text &AtAsText ( ulong position ) const;
                inline const FixPt &AtAsNumber ( ulong position ) const;
                inline const DateTime &AtAsDate ( ulong position ) const;
                inline const DateTime &AtAsTime ( ulong position ) const;
                inline const DateTime &AtAsTimeStamp ( ulong position ) const;
                inline bool AtAsBoolean ( ulong position ) const;
                inline const BinaryData &AtAsBinaryData ( ulong position ) const;
                inline void operator delete ( void *obj );
    
            private:
                DataVect ();
                DataVect ( const DataVect& other );
    
            };
    ...
    

    AM VERZWEIFELN !
    Fons



  • Was soll den "Text" sein??? Du musst diesen "Text" in einen "const wchar_t*" umwandeln!



  • Jochen Kalmbach schrieb:

    Was soll den "Text" sein??? Du musst diesen "Text" in einen "const wchar_t*" umwandeln!

    Danke und Sorry Jochen, so meldet es eben der Compiler.
    *'SysAllocString': Konvertierung des Parameters 1 von 'const fmx::Text' in 'const OLECHAR ' nicht möglich

    const fmx::Text ist der Inhalt aus dataVect.AtAsText(0)

    Kannst Du mir bitte ein paar Codezeilen schreiben (mit notwendigen Includes etc.), wie ich denn den Text in den "const wchar_t*" umwandle!
    Meinetwegen auch mehrere Möglichkeiten zum Testen.
    Gruß
    Fons



  • Ich habe keine Ahnung was Text sein soll, deshalb kann ich Dir nicht helfen!



  • Jochen Kalmbach schrieb:

    Ich habe keine Ahnung was Text sein soll, deshalb kann ich Dir nicht helfen!

    Hallo Jochen,
    Du hast mir ja schon viel weitergeholfen, ich verstehe aber da jetzt Deinen Ärger und die Reaktion nicht. Wenn Du mir nicht weiterhelfen willst, dann sags einfach, ist auch o.k.

    Es geht nach wie vor um den Inhalt von const fmx::DataVect& dataVect, da stecken die Parameter, die an die Funktion übergeben werden drin. Diese sollen dann nach BSTR gewandelt werden.
    Die Verweise auf die MSDN etc. helfen mir nicht, weil ich das nicht verstehe. Ich bräuchte bitte ein paar konkrete Codezeilen.
    Nix für ungut.
    Fons



  • Es geht ja nicht darum, dass ich Dir nicht helfen will... ich kann Dir nur nicht...
    Du musst uns schon sagen was denn "Text" sein soll... Zeig uns also am besten die Definition dieser Klasse...



  • Jochen Kalmbach schrieb:

    Es geht ja nicht darum, dass ich Dir nicht helfen will... ich kann Dir nur nicht...
    Du musst uns schon sagen was denn "Text" sein soll... Zeig uns also am besten die Definition dieser Klasse...

    Hab ich doch schon weiter oben. Nochmal:

    namespace fmx
        {
            class Text;
            class FixPt;
            class DateTime;
            class BinaryData;
        	class Data;
        	class DataVect;
        	class ExprEnv;
    
            FMX_PROCPTR( errcode, ExtPluginType ) ( short functionId, const ExprEnv& env, const DataVect& parms, Data& result );
    
            class DataVect
            {
            public:
                inline ulong Size () const;
                inline void Clear ();
                inline bool IsEmpty () const;
                inline void PushBack ( const Data &data );
                inline Data *PopBack ();
                inline const Data &At ( ulong position ) const;
                inline const Text &AtAsText ( ulong position ) const;
                inline const FixPt &AtAsNumber ( ulong position ) const;
                inline const DateTime &AtAsDate ( ulong position ) const;
                inline const DateTime &AtAsTime ( ulong position ) const;
                inline const DateTime &AtAsTimeStamp ( ulong position ) const;
                inline bool AtAsBoolean ( ulong position ) const;
                inline const BinaryData &AtAsBinaryData ( ulong position ) const;
                inline void operator delete ( void *obj );
    
            private:
                DataVect ();
                DataVect ( const DataVect& other );
    
            };
    

    Hoffentlich hilfts 😋
    Fons



  • Hmmmm... du solltest die Definition der Klasse "Text" zeigen, nicht "DataVect"!



  • Jochen Kalmbach schrieb:

    Hmmmm... du solltest die Definition der Klasse "Text" zeigen, nicht "DataVect"!

    class DataVect
            {
            public:
                ..
                inline const Text &AtAsText ( ulong position ) const;
                ...
    

    BSTR bstrParam = SysAllocString(dataVect.AtAsText(0));

    Das AtAsText ist der Wert im error C2664: 'SysAllocString': Konvertierung des Parameters 1 von 'const fmx::Text' in 'const OLECHAR *' nicht möglich.

    Definition:

    inline const Text &DataVect::AtAsText ( ulong position ) const
            {
                _fmxcpt _x;
                const Text &_rtn = FM_DataVect_AtAsText ( this, position, _x );
                _x.Check ();
                return _rtn;
    


  • Ich weiss immer noch nicht was "Text" ist... geht doch mal mit dem Cursor auf "Text" und drücke F12... was dann kommt, poste bitte hier... sonst muss ich leider aufgeben... vielleicht ist jemand anders in der Lage Dich zu verstehen... ich bin es (bisher) nicht...


Anmelden zum Antworten