Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

TCHAR[]/wstring zu string casten bei Unicode-Zeichensatz

Empfohlene Antworten

Veröffentlicht

Hallo,

mein Programm verwendet einen Unicode-Zeichensatz, weshalb die gängigste Lösung für mein Problem, die ich finden konnte, nicht funktioniert (einfach zu char* casten).

Ich möchte eine Datenbank öffnen (SQLite) mit "sqlite3_open". Als erstes Argument erwartet die Funktion einen const char*. Ich will die Datenbank in einem bestimmten Verzeichnis öffnen, basierend auf dem AppData-Verzeichnis, das ich so bekomme:


SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, dataDirectory)

"dataDirectory" ist dann ein TCHAR[].

1. Problem: Was mache ich mit der Variable "dataDirectory", um sie als const char* verwenden zu können (einfach casten geht grauenvoll schief)?

2. Problem: Ich würde beim Aufruf von "sqlite3_open" gerne noch einen String anhängen, ohne dabei die Variable "dataDirectory" zu verändern (also nicht mit strcat oder Ähnlichen) - mit "+" klappt das nur bei "string"-Variablen, wie geht das ansonsten?

Gruß

PL1994

Moin.

wie wäre es so?


TCHAR dataDirectory[MAX_PATH];

SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, dataDirectory);

CString derPfad = CString(dataDirectory);

  • Autor

Danke schon einmal für die Antworten. "CString" kann ich leider nicht verwenden. Bei VS Express ist ATL nicht dabei. "SHGetFolderPathA" habe ich versucht, dann bekomme ich einen Ausnahmefehler in SHCore.dll (Zugriffsverletzung) - woran kann das liegen?

  • Autor

Wie meinst du das? Ich habe dataDirectory jetzt zu einem char* gemacht.

Kann ich SHGetFolderPathA denn überhaupt verwenden mit einem Unicode-Zeichensatz?

Bearbeitet von PL1994

Ein Pointer muss immer auf etwas "zeigen". Sprich momentan zeigt dein Pointer auf keine Adresse im Speicher (NULL). Weshalb du wahrscheinlich eine NullPointerException bekommst.


char* dataDirectory = new char[MAX_PATH];

Ansonsten würde ich mir mal an deiner stelle std::string bzw std::wstring anschauen.

Was du geschrieben hast, trifft auf Java zu, aber nicht auf C++.

In C++ ist ein uninitialisierter Zeiger nicht automatisch NULL.

Es gibt auch keine vorgeschriebene Reaktion auf das Dereferenzieren von uninitialisierten (oder NULL-) Zeigern. Das Verhalten ist undefiniert.

Und new sollte man hier auch nicht benutzen. C++ hat keinen Garbage Collector. Rohe Zeiger sind nicht Exception-sicher und können Speicherlecks erzeugen.

Besser wäre

char dataDirectory[MAX_PATH];

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.