www.mikrocontroller.net

Forum: PC-Programmierung Windows CE String/Pointer anomalie


Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich ärgere mich das zweite Wochenende mit einem für mich absolut nicht 
nachvollziehbarem Problem. Ich programmiere mit embedded Visual C++ 4.0 
für den Pocket PC und teste meine Applikation mit dem Emulator/Debugger.
Ich habe die folgende Routine:
BOOL TSerial::InitComm( int nPort,int nBaud,int nParity,int nData,int nStop )
{

  char s[100];
  LPCTSTR lpsz = (LPCTSTR) &s;

  sprintf(s,"COM%d:", nPort);
  m_hFile = CreateFile(
    lpsz,
    //_T("COM1:"),
        GENERIC_READ|GENERIC_WRITE,  
        0, NULL,
        OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL );

Createfile braucht einen Pointer auf den ASCIIZ-String. Also füge ich 
mir per "sprintf" den String zusammen um die serielle schnittstelle zu 
öffnen und mit "lpsz" hab ich den Zeiger.
Im Debugger sieht das auch alles einigermasse passabel aus, d.h. ich
würde meinen das beide dieselbe Adresse haben:
Name          Value
lpsz          0x1c0cf028 "??:"
s             0x1c0cf028 "COM1:"

Der String dann allerdings hat einen anderen Inhalt????
Ich habe schon häufig genug C Programmiert, da hat der "&" operator 
immer
anstandslos gewerkt, nur hier will er einfach nicht (Auch &s[0] funzt 
nicht)

Wenn ich die "lpsz,"-Zeile auskommentiere und stattdessen durch den 
auskommentierten string "_T("COM1:")" ersetze funzt alles super.

Grübel,Grübel! Hat da jemand eine Idee was da schief läuft?


Dank Euch
Mario

Autor: sniper (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

deine Zuweisung

LPCTSTR lpsz = (LPCTSTR) &s;

ist unter WinCE nicht korrekt, weil T-Strings dort Unicode 16 Bit
Zeichen sind. Du castest also einen Zeiger auf char (ASCII 8Bit) auf 
einen Zeiger auf unsigned short (Unicode 16Bit).

Mach mal:
TCHAR s[32];
_tsprintf(s,"COM%d:", nPort);


Tipp:
Lerne unbedingt, was es mit _T, TCHAR, WSTR und char Strings auf sich 
hat,
das fällt dir sonst immer wieder auf die Füße - eigene Erfahrung...

Zu beachten ist besonders, dass TSTR mal Unicode und mal ASCII sein 
kann,
je nachdem, wie übersetzt wird.

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi sniper,

dank Dir für den Tipp, es funktioniert!
Ich hab: wsprintf(s, _T("COM%d:"), nPort);
genommen anstatt _tsprintf(s,"COM%d:", nPort);
das konnte ich nirgends in der Dokumentation finden,
da müsste ich wohl alle header-Dateien abklopfen.

Du hast schon richtig erkannt, ich stehe da noch ziemlich am Anfang. Ich 
versuche mich durch die Dokumentation zu schlagen, aber das SDK ist 
völlig unzureichend, auch die Erklärungen im MSDN sind unvollständig.
Kennst Du ein gutes Buch, dass System Programmierung unter CE 
einigermassen schlüssig erklärt? Das würd mir sicher das Leben einiges 
erleichtern!

Nochmals Danke
Mario

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.