CString to LPCSTR

Gast #2121526
Lesenswert?

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
  LPCSTR lpcstrDummy;
2
  lpcstrDummy = _T(m_cEditSend1);     // Die Variable der Editbox
3

4
  m_lLastError = m_SerialConnection.Write(lpcstrDummy);
5
  if(m_lLastError != ERROR_SUCCESS)
6
  {
7
    ShowError(m_SerialConnection.GetLastError(), _T("Error on sending m_cEditSend1"));
8
  }

was mach ich falsch, bzw wie kann ich es realisieren??

Danke für alle Antworten.
Persönliche Seite #2121565
Lesenswert?

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:
1
  m_lLastError = m_SerialConnection.Write(m_cEditSend1);

Sofern ein const-Pointer benötigt wird, ist die Konvertierung implizit; 
Du kannst auch mit
1
  m_lLastError = m_SerialConnection.Write(LPCTSTR(m_cEditSend1));
eine explizite Konvertierung vornehmen
Gast #2121574
Lesenswert?

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"));
Gast #2121576
Lesenswert?

Genau das hatte ich davor! Das geht aber nicht!
1
  m_lLastError = m_SerialConnection.Write(LPCTSTR(m_cEditSend1));
2
  if(m_lLastError != ERROR_SUCCESS)
3
  {
4
    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.
Gast #2121630
Lesenswert?

Also nochmal für alle:

die Funktion Write braucht als Parameter einen LPCSTR.
Write(_T("lalala"));    // Funktioniert!
1
  m_lLastError = m_SerialConnection.Write(LPCTSTR(m_cEditSend1));
2
  if(m_lLastError != ERROR_SUCCESS)
3
  {
4
    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?
Gast #2122192
Lesenswert?

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.
Gast #2123031
Lesenswert?

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?
#2123069
Lesenswert?

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.
#2128689
Lesenswert?

Ich habe es jetzt nicht selber probiert, aber dieser Ansatz sollte 
funktionieren:
1
CString str; // the given string
2
CStringA strA(str); // a helper string
3
LPCSTR ptr = strA;

Quelle:
http://social.msdn.microsoft.com/Forums/en/vclanguage/thread/df7ae955-0c5d-408f-98d8-7349897114f3

Ein LPCSTR ist ein ANSI String, während sich hinter einem CString ein 
CStringA (ANSI) oder ein CStringW (Unicode) verbergen kann. Das hängt 
von den Projekteinstellungen ab. Falls das Projekt auf Unicode 
eingestellt ist, funktioniert eine einfache Zuweisung oder ein Cast 
nicht, deshalb die explizite Konvertierung über den CStringA.

Auf MSDN gibt es übrigens auch einige Beispiele zu dem Thema:
http://msdn.microsoft.com/en-us/library/ms235631%28v=VS.100%29.aspx

Reinhard

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren