COM-DLL unter Visual C++.Net: Strings nach VB übergeben?



  • Hallo

    Ich versuche momentan unter Visual C++.Net eine COM-DLL zu schreiben, aus der ich dann u.a. in VB.Net Klassen automatisieren möchte. Dabei hat eine Klasse eine Funktion, die einen String übergibt.
    Inzwischen bin ich darauf gekommen, dass man als Rückgabewert in der DLL BSTR angeben muss, damit klappt es auch das VB-Projekt zu kompilieren.
    Aber ich habe das Problem, dass der String, den ich in VB bekomme den falschen Inhalt hat, meist "68" und ich weiß nicht, woran das liegen kann.
    Wenn ich die DLL in ein C++-Projekt einbinde, dann bekomme ich auch fehlerhafte Werte, jedoch andere. Hier hat mir der Assistent aber eine Funktion in der Klassendeklaration angelegt, die folgendermaßen aussieht:

    CString gibTreiberName(short index)
       {
          CString result;
          static BYTE parms[] = VTS_I2 ;
          InvokeHelper(0x3, DISPATCH_METHOD, VT_BSTR, (void*)&result, parms, index);
          return result;
       }
    

    Dem muss ich vertrauen, dass es das tut, was es soll, damit kenne ich mich gar nicht aus.

    Meine DLL-Funktion sieht folgendermaßen aus:

    BSTR CWebcam::gibTreiberName(SHORT index)
       {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       CString* tString = new CString("Hallo");
       CString string = *tString;
       BSTR bStr=string.AllocSysString();
    
       return bStr;
       }
    

    Könnte es vielleicht sein, dass da der String falsch zwischen Ascii und Unicode oder so umkodiert wird? Ich hab auch probiert, die Methode auf __stdcall zu setzen, bekomme aber beim Rücksprung aus der Methode immer eine Fehlermeldung.

    Wär schön, wenn mir jemand erklären könnte, was ich falsch mache, oder wo das Problem liegt, ich hoffe ich konnte mich halbwegs verständlich machen.

    Danke schon mal
    Unti



  • Deine funktion produziert ein memory leak

    Ich hab auch probiert, die Methode auf __stdcall zu setzen, bekomme aber beim Rücksprung aus der Methode immer eine Fehlermeldung

    was ist das für ne meldung?



  • Wenn ich mal annehme das "gibTreiberName()" deine COM-Funktion sein soll, dann
    lässt deine Implementierung erkennen das du weder weisst was COM ist noch wie
    es funktioniert. 🙄

    Beispiel mit ATL
    dummy.idl:

    ...
    interface ITester : IDispatch
    {
    	[propget, id(1), helpstring("Eigenschaft TreiberName")] HRESULT TreiberName([in] index, [out, retval] BSTR *pVal);
    	...
    };
    ...
    

    Tester.cpp:

    ...
    STDMETHODIMP CTester::get_TreiberName(index, BSTR *pVal)
    {
    	// BEISPIEL:
    	CComBSTR ret = OLESTR("Ich bins");
    	*pVal = ret.Detach();
    
    	return S_OK;
    }
    ...
    

Anmelden zum Antworten