PL1994 Geschrieben 30. Oktober 2014 Teilen Geschrieben 30. Oktober 2014 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mfk'); DROP TABLE Users;-- Geschrieben 31. Oktober 2014 Teilen Geschrieben 31. Oktober 2014 Ruf SHGetFolderPathA auf, diese Funktion erwartet einen char*. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Hexagon Geschrieben 31. Oktober 2014 Teilen Geschrieben 31. Oktober 2014 Moin. wie wäre es so? TCHAR dataDirectory[MAX_PATH]; SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, dataDirectory); CString derPfad = CString(dataDirectory); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
PL1994 Geschrieben 4. November 2014 Autor Teilen Geschrieben 4. November 2014 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mfk'); DROP TABLE Users;-- Geschrieben 4. November 2014 Teilen Geschrieben 4. November 2014 Wohin zeigt denn dataDirectory? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
PL1994 Geschrieben 4. November 2014 Autor Teilen Geschrieben 4. November 2014 (bearbeitet) Wie meinst du das? Ich habe dataDirectory jetzt zu einem char* gemacht. Kann ich SHGetFolderPathA denn überhaupt verwenden mit einem Unicode-Zeichensatz? Bearbeitet 4. November 2014 von PL1994 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mfk'); DROP TABLE Users;-- Geschrieben 4. November 2014 Teilen Geschrieben 4. November 2014 dataDirectory ist ein Zeiger. Wohin lässt du diesen Zeiger zeigen? SHGetFolderPath hat da ziemlich konkrete Anforderungen. Wenn du gar nichts machst, ist dieser Zeiger uninitialisiert, zeigt also irgendwo in den Speicher. Das kann nicht funktionieren. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
hey123 Geschrieben 4. November 2014 Teilen Geschrieben 4. November 2014 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mfk'); DROP TABLE Users;-- Geschrieben 4. November 2014 Teilen Geschrieben 4. November 2014 Kommst du von Java, hey123? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
hey123 Geschrieben 4. November 2014 Teilen Geschrieben 4. November 2014 Bin in meiner Ausbildung in Java bin aber mehr der C++ fan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mfk'); DROP TABLE Users;-- Geschrieben 4. November 2014 Teilen Geschrieben 4. November 2014 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]; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
hey123 Geschrieben 4. November 2014 Teilen Geschrieben 4. November 2014 Du hast recht, da bin ich wohl zusehr ins Java abgedriftet Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
PL1994 Geschrieben 4. November 2014 Autor Teilen Geschrieben 4. November 2014 Habe es jetzt doch anders gelöst: Mit "WideCharToMultiByte" bekomme ich meinen char* und kann "SHGetFolderPath" verwenden Danke euch! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.