Forum: PC-Programmierung CString to LPCSTR


von visualstudio10 (Gast)


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.

von g457 (Gast)


Lesenswert?

> was mach ich falsch

..sagt Dir das nicht der Compiler?

HTH

von visualstudio10 (Gast)


Lesenswert?

Das hier:

 error C2065: 'Lm_cEditSend1': nichtdeklarierter Bezeichner

von Rufus Τ. F. (rufus) Benutzerseite


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

von Muetze1 (Gast)


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"));

von visualstudio10 (Gast)


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.

von g457 (Gast)


Lesenswert?

> 1>error C2440: '<function-style-cast>': 'CString' kann nicht in 'LPCSTR'
> konvertiert werden

Dann nimm den Operator LPCTSTR, den gibbet nämlich.

von visualstudio10 (Gast)


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?

von Karl H. (kbuchegg)


Lesenswert?

m_lLastError = m_SerialConnection.Write( (LPCTSTR) m_cEditSend1 );

von visualstudio (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

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

von visualstudio10 (Gast)


Lesenswert?

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?

von visualstudio10 (Gast)


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?

von Karl H. (kbuchegg)


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.

von Reinhard R. (reinhardr)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.