Hallo Leute,
ich habe soeben gegoogled was eine Funktion für eine Serielle
Schittstelle angeht.
Diese verlangt einen LPCSTR, wenn ich also was per Schnittstelle senden
will mach ich eben im Code den _T("blablabla");
Aber wenn ich nun eine Edit Box hab, kann ich nur dieser einen CString
zuweißen.
1
LPCSTRlpcstrDummy;
2
lpcstrDummy=_T(m_cEditSend1);// Die Variable der Editbox
Sieh Dir mal die Definition des Macros _T() an. Und sieh Dir mal
ganz genau Deine Fehlermeldung an.
Und sieh in der Dokumentation Deines Compilers nach, was ein vor eine
Stringkonstante gestelltes L bedeutet.
visualstudio10 schrieb:> LPCSTR lpcstrDummy;> lpcstrDummy = _T(m_cEditSend1); // Die Variable der Editbox>> m_lLastError = m_SerialConnection.Write(lpcstrDummy);
Das geht erheblich einfacher:
CString ist doch eine String-Klasse. Die meisten haben eine
Member-Funktion für die Rückgabe eines const char * für solche Fälle wie
du ihn gerade hast.
Die Methode heißt bei vielen Implementationen c_str(). Also probier es
mal so:
m_lLastError = m_SerialConnection.Write(m_cEditSend1.c_str());
if(m_lLastError != ERROR_SUCCESS)
{
ShowError(m_SerialConnection.GetLastError(), _T("Error on sending
m_cEditSend1"));
ShowError(m_SerialConnection.GetLastError(),_T("Error on sending m_cEditSend1"));
5
}
1>error C2440: '<function-style-cast>': 'CString' kann nicht in 'LPCSTR'
konvertiert werden
1> Kein benutzerdefinierter Konvertierungsoperator verfügbar,
der diese Konvertierung durchführen kann, oder der Operator kann nicht
aufgerufen werden
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0
übersprungen ==========
Ganz ehrlich ich hab keine Ahnung was das soll. Ich komm da nicht drauf.
Genau so hatte ich das vorher ja auch schon, egal wie ich es schreibe es
geht nicht.
Bitte wenn mir einer helfen kann, wär mir echt ne große Hilfe.
ShowError(m_SerialConnection.GetLastError(),_T("Error on sending m_cEditSend1"));
5
}
Bei diesem Beispiel bringt er das:
1>error C2664: 'LONG CSerial::Write(LPCSTR,DWORD *,LPOVERLAPPED,DWORD)':
Konvertierung des Parameters 1 von 'LPCTSTR' in 'LPCSTR' nicht möglich
1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die
Konvertierung erfordert einen reinterpret_cast-Operator oder eine
Typumwandlung im C- oder Funktionsformat.
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0
übersprungen ==========
Und m_cEditSend1.c_str(); konnte ich nicht finden.
Langsam scheint es mir, dass man diese Umformung nur seeeehr schwer
machen kann. Warum so schwer? Geht das nicht einfacher?
ich glaube das hab ich auch schonmal ausprobiert. Doch habe auch hier
einen fehler bekommen.
Ich glaube auch, dass die write funktion einen lpcstr benötigt, warum
konvertiere ich dann in einen lpcTstr?
Ich probiere es heute abend aber nochmal aus.
visualstudio schrieb:> ich glaube das hab ich auch schonmal ausprobiert. Doch habe auch hier> einen fehler bekommen.>> Ich glaube auch, dass die write funktion einen lpcstr benötigt, warum> konvertiere ich dann in einen lpcTstr?
weil ein CString einen operator dafür hat
Also die Funktion braucht einen LPCSTR also klappt die Version von
Karl-Heinz natürlich nicht, aber wie klappt es?
Bin echt verzweifelt, es muss doch IRGENDWIE gehn oder nicht?
Also ich habe im Internet nochmal nach Lösungen gesucht, habe aber
absolut nichts gefunden, was auch nur annähernd funktionieren würde.
Geht das überhaupt oder ist das in C++ nicht möglich?
visualstudio10 schrieb:> Also die Funktion braucht einen LPCSTR also klappt die Version von> Karl-Heinz natürlich nicht, aber wie klappt es?
Was heißt 'klappt nicht'?
Im Zweifelsfall kann man unwilligen Code immer mit einem Cast zur
Mitarbeit bewegen. Ob das aber das ist, was du willst, steht auf einem
anderen Blatt.
m_lLastError = m_SerialConnection.Write( (LPCSTR)(LPCTSTR) m_cEditSend1
);
Hast du dein Projekt eigentlich mit Unicode Support erstellt?
Denn wenn im CString ein Unicode String enthalten ist, dann wirst du den
wahrscheinlich vorher mal auf ASCII runterbringen müssen.
(Und da ich um diese Thematik immer einen großen Bogen gemacht habe,
kann ich dazu auch nicht viel sagen).
PS: Das hat mit C++ an sich überhaupt nichts zu tun. So wie die genau
Form des Gewindes einer Schraube erst mal nichts damit zu tun hat, dass
sie von BMW verwendet wird.