GetPrivateProfileString Problem mit Datentypen
-
Hallo, ich bin vor kurzem von python auf c++ umgestiegen und habe in c++ probleme mit den vielen daten Typen.
Ich möchte mit der WinApi Funktion GetPrivateProfileString einen Wert aus einer Ini-Datei lesen. Dabei soll der Pfad zur Datei aus 2 Teilen bestehen, einmal der Pfad in dem das Programm ausgeführt wird, diesen erhalte ich mit QDir().currentPath().toStdString();.
Und dem String "/file.ini".
Zudem möchte ich den Inhalt des Schlüssels aus der Ini Datei als ganz normalen String zurück bekommen.
Ich komme schon nicht damit zurecht, wie ich die beiden Strings in die WCHAR Variable für den Dateipfad bekomme, ich hoffe mir kann jemand helfen.mfg Ceddy
-
Zeig doch mal bitte, wie dein bisheriger Versuch aussieht.
-
Das wäre dann so
WCHAR* path; WCHAR KeyContent[200]; DWORD keyContentSize=200; QDir().currentPath().toWCharArray(path); path=path+L"/file.ini"; GetPrivateProfileString(L"section1",L"key2",NULL,KeyContent,keyContentSize,path);
-
Ceddy schrieb:
path=path+L"/file.ini";
Das geht so leider nicht (du addierst hier Speicheradressen, nicht das, worauf sie zeigen). Du müsstest einen neuen Puffer schaffen, in den du path und den Dateinamen hineinkopierst. Es wäre besser, wenn du eine String-Klasse verwendest. Dann kannst du auch Strings per operator+ zusammensetzen. Möglich wären std::string (bzw. std::wstring) oder gleich QString, da du ja sowieso Qt verwendest.
-
Danke schön, jetzt bin ich schonmal ein Stück weiter und habe den Dateipfad mit dem Dateinamen zusammengesetzt:
WCHAR* path; QString pathQString; WCHAR KeyContent[200]; DWORD keyContentSize=200; pathQString=QDir().currentPath(); pathQString=pathQString+"/file.ini"; pathQString.toWCharArray(path); GetPrivateProfileString(L"section1",L"key2",NULL,KeyContent,keyContentSize,path);
Nun habe ich versucht den QString wieder in ein WCHAR umzuwandeln:
pathQString.toWCharArray(path);
Jedoch stürzt das Programm ab nachdem ich diese Zeile eigefügt habe und ich bekomme von Windows die Meldung, dass das Programm nicht mehr funktioniert
-
WCHAR* path;
Hier einen Zeiger zu deklarieren, reicht nicht. Du musst ihm auch Speicher zuweisen, damit toWCharArray sein Ergebnis da reinkopieren kann. Versuch's mal so:
WCHAR path[1024];
Die 1024 lassen sich vermutlich durch irgendeine Konstante ersetzen, die Qt anbietet (kenne mich mit Qt gar nicht aus...).
Übrigens solltest du dich dringend mal informieren, was Debugging ist und wie das genau funktioniert. Dann bist du bei Laufzeitfehlern nämlich nicht aufgeschmissen, sondern kannst die Laufzeit per Haltepunkt anhalten, dir Variableninhalte ansehen usw. Dann hängst du nicht immer bei Problemen.
-
Danke jetzt funktioniert das zumindest.
Aber wenn ich mit:KeyContentQString.fromWCharArray(keyContent); this->ui->txtInputPath->setText(KeyContentQString);
Denn Inhalt des Schlüssels in eine Textbox schreiben will bleibt diese leer, kann man vlt beim debuggen in der qtsdk den Inhalt der variablen überprüfen?
-
Du kannst definitiv durch Debugging während der Laufzeit nachsehen, was eigentlich in der Variablen drinsteht. Aber wie das genau bei dir funktioniert, musst du bitte selbst in Erfahrung bringen. Ich weiß ja nicht mal, welche IDE du verwendest. Stichwörter für die Suche währen: [Bezeichnung deiner IDE], Debugging, Breakpoint/Haltepunkt.
-
So beim Debuging hat sich ergeben, das keyContent etwas steht, die Variable KeyContentQString jedoch leer bleibt woran kann das nun wieder liegen?
-
Ceddy schrieb:
So beim Debuging hat sich ergeben, das keyContent etwas steht, die Variable KeyContentQString jedoch leer bleibt woran kann das nun wieder liegen?
Das hier vielleicht?
http://www.qtforum.org/article/27361/assign-a-wchar-t-array-to-qstring.html#post94495
-
Danke und schon taucht ein neues problem auf, denn die Api Funktion scheint den wert aus der ini datei nicht auszulesen, da in der textbox nun "NULL" ausgegeben wird, dabei stimmen die key und die section -.- Und wen ich den pfad in der Textbox ausgeben lasse steht da auch sowas drin: C:/Users/Cedric/Programmierung/c++/HardDriveCopy/0.1/HardDriveCopy-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK__Debugi㗨ȵ伉樦
-
Hast du ein Unicode-Problem? Zeig bitte noch mal aktuellen Code.
-
ier ist er:
#include "mwsettings.h" #include "ui_mwsettings.h" #include <windows.h> #include <iostream> #include <strings.h> #include <QDir> using namespace std; mwSettings::mwSettings(QWidget *parent) : QMainWindow(parent), ui(new Ui::mwSettings) { ui->setupUi(this); string ok="chack"; WCHAR path[1024]; QString pathQString; QString KeyContentQString; WCHAR keyContent[200]; DWORD keyContentSize=200; pathQString=QDir().currentPath(); pathQString=pathQString+"/file.ini"; pathQString.toWCharArray(path); GetPrivateProfileString(L"section1",L"key2",L"joo",keyContent,keyContentSize,path); wcout<<keyContent; KeyContentQString=QString::fromWCharArray(keyContent); this->ui->txtInputPath->setText(KeyContentQString); } mwSettings::~mwSettings() { delete ui; }
-
Was muss überhaupt Unicode sein? Der Pfad? Der Wert?