WritePrivateProfileString -> Access Violation



  • Hi!
    Ich hab mir eine einfache Funktion geschrieben mit der ich in eine Ini schreiben kann die sieht wie folgt aus:

    void IniWrite(std::string Name, std::string Section, std::string Key, std::string Value)
    {
    	LPSTR cDir = "";
    
    	GetCurrentDirectoryA(BUFSIZE,cDir); 
    	std::string sDir = cDir;
    	sDir.append("/");
    	sDir.append(Name);
    
    	WritePrivateProfileStringA(Section.c_str(),Key.c_str(),Value.c_str(),sDir.c_str());
    }
    

    Die funktion steht in einer header datei und ich rufe sie dann wie folgt auf:

    int _tmain(int argc, _TCHAR* argv[])
    {
    	IniWrite("test.ini","section","key","test");
    
    	system("PAUSE");
    	return 0;
    }
    

    Soweit so gut Compiler sagt nichts aber wenn ich das Programm ausführe Crasht es...
    Beim debuggen bekomm ich dann die nachricht dass es eine Access Violation Code 0xc0000005 ist.

    Führe ich statt IniWrite folgenden code aus funktioniert es aber..

    LPSTR cDir = "";
    
    	GetCurrentDirectoryA(BUFSIZE,cDir); 
    	std::string sDir = cDir;
    	sDir.append("/");
    	sDir.append(Name);
    
    	WritePrivateProfileStringA("section","key","test",sDir.c_str());
    

    Ich hab auch eine funktion fürs lesen geschrieben die funktioniert einwandfrei und is im grunde genommen genau das selbe wie die funktion zum schreiben...

    Hier die Funktion zum lesen:

    std::string IniRead(std::string Name, std::string Section, std::string Key, std::string Default)
    {
    	char rStr[255];
    	LPSTR cDir;
    
    	GetCurrentDirectoryA(BUFSIZE,cDir); 
    	std::string sDir = cDir;
    	sDir.append("/");
    	sDir.append(Name);
    
    	GetPrivateProfileStringA(Section.c_str(),Key.c_str(),Default.c_str(),rStr,sizeof(rStr),sDir.c_str());
    
    	return rStr;
    }
    

    Ich weiss nich mehr weiter.. zermürbe mir schon seid stunden den kopf darüber dabei wollte ich doch eig nur erreichen dass ich beim lesen/schreiben der dlls nich so viel code schreiben muss und damit zeit sparen kann 😣

    Sieht vllt von euch einer den Fehler den ich Blindfisch nicht sehe??

    Danke im voraus
    lg BBM



  • Warum debuggst Du es nicht einfach... bzw. schaust Dir den Callstack an... Vermutlich kracht es auch wo ganz anders...



  • BBM schrieb:

    LPSTR cDir = "";
    	
    	GetCurrentDirectoryA(BUFSIZE,cDir);
    

    Das war ja wohl gleich gar nichts! Und davon ab: Für Deinen Fall ist GetCurrentDirectory eindeutig die falsche Funktion.



  • @ghnghng: wieso nich? beim IniRead funktioniert es doch auch..



  • LPSTR cDir = "";
    
    	GetCurrentDirectoryA(BUFSIZE,cDir);
    

    Ich möchte mal erklären warum ich das so geschrieben habe...
    Wenn ich statt >>LPSTR cDir = "";<< nur >>LPSTR cDir;<< genommen habe, hab ich nen Warning bekommen dass cDir benutzt wurde bevor sie initialisiert wurde.

    Und >>GetCurrentDirectory<< hab ich benutzt weils das erste war das MSDN ausgespuckt hat und es beim IniRead funktioniert hat.

    Naja is ja nett dass du mich darauf hinweisst dass es nicht gut ist aber wie wäre es denn besser?

    lg



  • ach mist wieder vergessen 😣
    @Jochen: nein es "kracht" bei zeile 12 des testprograms, das ist die zeile wo IniWrite() steht ...



  • Habs jetz .. thread kann geschlossen werden oder so

    lg



  • An was lag es?



  • 4-fach Post 🙄

    Vielleicht wäre es ganz interessant zu wissen, WAS falsch war ?

    Im Übrigen steht in "Zeile 12" gar nichts, diese Angabe ist vermutlich auf DEINEN code bezogen, hilft uns also auch nicht weiter.



  • Es liegt natürlich daran dass er, anstatt irgendwie Speicher zu allozieren, einen String-Literal überschrieben hat.


Anmelden zum Antworten