Forum: PC-Programmierung Windows CE String/Pointer anomalie


von Mario (Gast)


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:
1
BOOL TSerial::InitComm( int nPort,int nBaud,int nParity,int nData,int nStop )
2
{
3
4
  char s[100];
5
  LPCTSTR lpsz = (LPCTSTR) &s;
6
7
  sprintf(s,"COM%d:", nPort);
8
  m_hFile = CreateFile(
9
    lpsz,
10
    //_T("COM1:"),
11
        GENERIC_READ|GENERIC_WRITE,  
12
        0, NULL,
13
        OPEN_EXISTING,
14
    FILE_ATTRIBUTE_NORMAL,
15
    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

von sniper (Gast)


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.

von Mario (Gast)


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

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.