Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C] TCHAR und Unicode (https://www.delphipraxis.net/77953-%5Bc%5D-tchar-und-unicode.html)

Luckie 27. Sep 2006 08:34


[C] TCHAR und Unicode
 
Beruflich bedingt, muss ich mich mit C/C++ rumsch...auseinandersetzen. Da ich gerne von Anfang an auf der Sicherenseite sein will verwende ich nur jeweils die Unicode Funktionen und als Datentyp für Zeichenfolgen dann TCHAR. Das sieht dann zum Beispiel so aus:
Code:
/*
 *  SysErrorMessage
 *  Obtains error message strings for the system error codes returned by GetLastError
 * 
 */
TCHAR *SysErrorMessage (DWORD dwErrorCode, TCHAR *pszBuf, int nLenBuf)
{
  FormatMessage(
     FORMAT_MESSAGE_FROM_SYSTEM | (pszBuf ? 0 : FORMAT_MESSAGE_ALLOCATE_BUFFER),
    NULL,
    dwErrorCode ? dwErrorCode : GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    pszBuf ? pszBuf : (LPTSTR)&pszBuf,
    pszBuf ? nLenBuf : 0,
    NULL);
  return pszBuf;
}

/*
 *  FileExistsW
 *  Checks whether a given file exists or not
 * 
 */
BOOL FileExistsW(TCHAR *Filename) {
   WIN32_FIND_DATA wfd;
   HANDLE hFile;
   hFile = FindFirstFileW(Filename, &wfd);
   if (hFile != INVALID_HANDLE_VALUE) {
      FindClose(hFile);
   }
   return (BOOL)hFile;
}
Mache ich denn das so richtig? Funktionieren tut es, aber das muss noch lange nichts heißen. ;)

messie 27. Sep 2006 09:54

Re: [C] TCHAR und Unicode
 
...so richtig geblickt habe ich die C-TypenStruktur auch nicht. Ich arbeite mit wchar_t als Unicode-Typ. Für die Benutzung von TCHAR mußt Du beim Kompilieren das richtige Makro aktivieren, das habe ich noch nicht probiert. Durch meine Festlegung kann ich ausschließlich mit Unicode arbeiten aber das hat bisher auch keinen gestört.

Grüße, Messie

Flocke 27. Sep 2006 10:36

Re: [C] TCHAR und Unicode
 
Zitat:

Zitat von Luckie
Mache ich denn das so richtig? Funktionieren tut es, aber das muss noch lange nichts heißen. ;)

Das funktioniert so nur, wenn du das Symbol UNICODE definierst.

In der Datei <tchar.h> wird TCHAR eben als "char" oder als "wchar_t" definiert, je nachdem ob UNICODE definiert ist oder nicht. Dort gibt es auch eine ganze Menge von Definitionen, die mit "_t" beginnen (so wird z.B. _tcscpy zu strcpy oder wcscpy).

Auch in <windows.h> wird nach UNICODE unterschieden. Somit ist "FindFirstFile" einfach definiert als entweder "FindFirstFileA" oder "FindFirstFileW".

Fazit:

Wenn du <tchar.h> benutzt, dann benutze den Typen TCHAR und nicht explizit die Widechar-Funktionen des API. Außerdem solltest du alle Character- und String-Konstanten in _T() einschließen. Dann kannst du nämlich mit "-DUNICODE" eine Unicode-Anwendung compilieren und ohne diesen Schalter eben eine Ansi-Anwendung. Dort wo's nicht anders geht (z.B. ist "%s" in allen printf-Varianten immer ein Ansi-String und "%S" ein Unicode-String) musst du dann ggf.mit "#ifdef UNICODE ... #else ... #endif" den Code so oder so schreiben.

ODER

Wenn du immer die Unicode-Varianten nehmen willst, dann benutze auch direkt "wchar_t" als Typ, schreibe direkt L vor jede Character- und String-Konstante und benutze direkt die Widechar-Varianten der API-Funktionen.

Luckie 27. Sep 2006 10:56

Re: [C] TCHAR und Unicode
 
Ah ja. Gut. Dann werde ich TCHAR benutzen und auch nicht explizit die WideChar Funktionen.

Olli 7. Okt 2006 19:12

Re: [C] TCHAR und Unicode
 
LPTSTR und LPCTSTR kannst du statt TCHAR * und const TCHAR * nehmen ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz