Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Visual C++, CString in Variant umwandeln

anul / 7 Antworten / Baumansicht Nickles

Ich will die Funktion:


void CMSComm::SetInput(const VARIANT& newValue) aus dem Kommunikationssteuerelement(MSComm) verwenden.


Wie übergebe ich den Parameter newValue richtig? Ich habe es so versucht:


COleVariant vSend;
UpdateData(true);   // Wert kommt aus Ansicht


// Übergabe eines Strings an eine VARIANT-Variable
vSend.bstrVal = m_strTextSend.AllocSysString();


// String senden
m_ocxMsComm.SetOutput( vSend);     


Ich erhalte beim Ausführen die Meldung: "Invalid property value"
Was mache ich falsch?


Wie kann ich eine char Variable in eine Variabe vom Typ VARIANT und zurück wandeln?


 


 

bei Antwort benachrichtigen
thomas woelfer anul „Visual C++, CString in Variant umwandeln“
Optionen

sehe da keine fehler; vermute das dein control in dem variant einen anderen datentyp und eben keinen BSTR erwartet. das sollte aber der dokumentation des control zu entnehmen sein...

WM_HOPETHISHELPS
thomas woelfer

this posting contains no tpyos.
bei Antwort benachrichtigen
anul thomas woelfer „ist voellig ok so“
Optionen

Welche Variant Typen gibt es? Mir sind COleVariant und VARIANT bekannt. Welche Elemente gibt es in diesen Variant-Typen.

Es handelt sich um das ActiveX Steuerelement MSComm(mscomm32.ocx).
Ich möchte die Funktion SetOutput (void CMSComm::SetOutput(const VARIANT& newValue)) benutzen.
Diese Funktion sieht in der Wrapper-Klasse CMSComm so aus:

void CMSComm::SetOutput(const VARIANT& newValue)
{
static BYTE parms[] = VTS_VARIANT;

InvokeHelper(0x19, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, &newValue);
}
Ich rufe die Funktion folgendermaßen auf:

void CComSchnDlg::OnButsend()
{

COleVariant vSend;

UpdateData(true);

// Übergabe eines Strings an eine VARIANT-Variable
vSend.bstrVal = m_strTextSend.AllocSysString();

// String senden
m_ocxMsComm.SetOutput( vSend);

}

Die MS-Hilfe(Comm96.hlp) sagt u dem Übergabeparameter aus:
Die Output-Eigenschaft kann Textdaten oder Binärdaten übertragen.
Damit mit der Output-Eigenschaft Textdaten übertragen werden können,
müssen Sie einen Wert vom Typ Variant angeben, der eine Zeichenfolge enthält.
Damit Binärdaten übertragen werden können, müssen Sie einen Wert vom Typ Variant an die Output-Eigenschaft übergeben, in dem ein Byte-Datenfeld enthalten ist.

Mein Buch:"Das große Buch Visual C++ 5" von Dr. Fleischhauer
im Data Becker Verlag erschienen sagt nur aus, daß der Übergabeparameter vom Typ Variant ist.

Wo finde ich mehr Informationen zu diesen Steuerelement?
Gibt es ein Visual C++ Beispiel? Wo?

bei Antwort benachrichtigen
thomas woelfer anul „ist voellig ok so“
Optionen

du hast das was falsch verstanden. COleVariant ist ein kapselung von VARIANT fuer mfc. VARIANT selbst ist der zugrunde liegende ole 'datentyp', wobei datentyp nicht die richtige bezeichnung ist: ein variant kann mehr oder minder beliebige datentype aufnehmen - das ding dien einzig und allein dem transport von daten zwischen zwei prozessen per ole. was dann genau in einem variant drin ist bzw. sein muss, das bestimmt derjenige, der den variant spaeter ausliesst - in deinem fall das control.

und das control will offenbar ein array aus bytes als parameter sehen und eben keinen bstr. ein beispiel (in vb) ist hier:

http://support.microsoft.com/directory/article.asp?ID=KB;EN-US;Q158008&

this posting contains no tpyos.
bei Antwort benachrichtigen
anul Nachtrag zu: „Visual C++, CString in Variant umwandeln“
Optionen

Soweit habe ich verstanden.
Das Control braucht den Parameter nicht als BSTR-Variant sondern als Byte Array.
Der Datentyp short hat den Elementnamen lVal, float ftlVal.
Aber wie kann ich Daten aus Variablen mit dem Datentyp BYTE,
unsigned char oder char in einen Variant Datentyp umwandeln?

Ich habe es so versucht:

VARIANT vSend;
unsigned char chrTmp[20];

chrTmp[0] = 'H';
chrTmp[1] = 'A';
chrTmp[2] = 'L';
chrTmp[3] = 'L';
chrTmp[4] = 'O';
chrTmp[5] = 0;


// Übergabe eines Strings an eine VARIANT-Variable
vSend.pbVal = chrTmp;

// String senden
m_ocxMsComm.SetOutput( vSend);

Das Ergebnis war das gleiche... Die Umwandlung hat funktioniert(
der Compiler hat nicht gemeckert) aber das Control lehnt den Datentyp ab. Wie wandel ich BYTE Datenfelder in Variant um?


PS: In VB sieht das so schön einfach aus...

bei Antwort benachrichtigen
thomas woelfer anul „soweit ok“
Optionen

nurmal so vorweg... hab mir das com ctrl grad mal angesehen. das ist ein bisschen kompliziert, weil der datentyp den man uebergeben kann von den einstellungen des controls abhaengig ist. so _kann_ man durchaus dem web mit dem BStr nehmen den wir schon hatten - dann muss man das control aber auch auch 'text' stellen.

wenns um binaerdaten geht (das ist wohl das was du willst) dann wird _kein_ null-terminierter string uebergeben wie du das immer wieder versuchst.

was du hier willst ist ein COleSafeArray (doku dazu siehe dort.)

WM_HOPETHISHELPS

this posting contains no tpyos.
bei Antwort benachrichtigen
anul thomas woelfer „kommt drauf an... :)“
Optionen

Der Tip:
Haltepunkt bei der Funktion setzen und mit F11 in die Funktion springen.
Man sieht dann, welcher Parameter benötigt wird.
Das mußte ich zweimal machen und nun glaube ich zu Wissen, daß ein Datentyp BYTE verlangt wird.
Ist doch richtig oder?


void CMSComm::SetOutput(const VARIANT& newValue)
{
static BYTE parms[] = VTS_VARIANT;
InvokeHelper(0x19, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL,
parms, &newValue);
}

void AFX_CDECL CWnd::InvokeHelper(DISPID dwDispID, WORD wFlags, VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ...)
{
ASSERT(m_pCtrlSite != NULL); // not an OLE control (not yet, at
least)

if (m_pCtrlSite == NULL)
return;

va_list argList;
va_start(argList, pbParamInfo);
m_pCtrlSite->InvokeHelperV(dwDispID, wFlags, vtRet, pvRet,
pbParamInfo, argList);
va_end(argList);
}

Wie bekommt man jetzt ein BYTE-Array in ein Variant????
Wo kann ich am Control den zu übergebenen Datentyp einstellen?


Ich will Daten, die durch die serielle Schnittstelle gesendet werden kontrollieren.
Dazu sollen die Daten zwischen zwei kommunizierenden Geräten durch den PC geleitet werden.
Ein Control soll Daten empfangen, eins soll sie senden und umgekehrt. Das ist aber Zukunft.
Gegenwärtig will ich nur den Umgang mit Controls und Visual C++ anhand von kleinen Projekten lernen.
Im Prinzip ist mir egal, wie ich die Daten aus dem Control kommen. Ich kann sie dann wandeln, das kriege ich schon hin denke ich.


bei Antwort benachrichtigen
anul Nachtrag zu: „Step by Step...“
Optionen

So einfach gehts:

void CComSchnDlg::OnButsend()
{
UpdateData(true);

COleVariant vSend(m_strTextSend);// CString Sendetext

// Zeichen senden
m_ocxMsComm.SetOutput( vSend);
}

bei Antwort benachrichtigen