Wieso geht das nicht CString nach *char



  • FAQ habe ich schon gelesen. dich lösung geht bei mir nicht.

    char* file;
    #define LangItemLen 256
    ...
    
    	char buf[LangItemLen];
    	GetModuleFileName(NULL, buf, LangItemLen-1);
    
    	CString strPfad;
    	strPfad.Format("%s", buf);
    
    	int nTmp = strPfad.ReverseFind('\\');
    	strPfad.Delete(nTmp+1,strPfad.GetLength()-nTmp);
    
    	strPfad += "System.ini";
    
    	printf("%s %s\n", (LPCTSTR)file, strPfad);
    ...
    

    wieso kann ich hier nicht casten. ich habe schon so viel versucht.
    ich öffen schon vorher eine ini und dadurch verliere ich meinen pfad zu dieser ini. ich will ihr deshalb mitteilen wo sich das hauptprogramm befindet und wo dort diese ini ist. und das muss ich halt in der variable file ablegen. diese ist jedoch ein char* und ich habe hier ein CString.



  • Geht nicht ist keine ausreichende Problembeschreibung. Was geht nicht? Meckert der Compiler, funktioniert es nicht wie gewünscht oder was?



  • Da Du nicht genau sagst wo das Problem ist, muss ich raten: Du kompilierst mit _UNICODE, UNICODE?
    Dann verwende entweder TCHAR anstelle von char oder wandle den char nach TCHAR um... (z.B: via CA2CT)



  • Also, wenn ich die kopierfunktion printf ausführe, dann ist die variable file immernoch leer. also würde der kopiervorgang gar nicht zu statten kommen.

    wir kann ich dass denn richtig casten. kann mir jemand ein beispiel nennen. das eine beispiel habe ich ja aus der faq aber es geht irgendwie nicht. es muss aber ein char* sein und die andere variable ein cstring. man ist c++ in der hinsicht schlecht.



  • Was für eine Kopierfunktion/vorgang?

    Wenn Du es ganz richtig machen willst, dann mach folgendes:

    char* file;
    #define LangItemLen 256
    ...
        TCHAR buf[LangItemLen];
        GetModuleFileName(NULL, buf, LangItemLen-1);
        CString strPfad;
        strPfad = buf;
    
        int nTmp = strPfad.ReverseFind(_T('\\'));
        strPfad.Delete(nTmp+1,strPfad.GetLength()-nTmp);
    
        strPfad += _T("System.ini");
    
        _tprintf(_T("%s %s\n"), CA2CT(file), (LPCTSTR) strPfad);
    ...
    

    Den ersten Teil kannst Du auch enfacher machen:

    CString strPfad;
        GetModuleFileName(NULL, strPfad.GetBuffer(LangItemLen), LangItemLen-1);
        strPfad.ReleaseBuffer();
    


  • MrVerzweifelt schrieb:

    wir kann ich dass denn richtig casten. kann mir jemand ein beispiel nennen. das eine beispiel habe ich ja aus der faq aber es geht irgendwie nicht. es muss aber ein char* sein und die andere variable ein cstring. man ist c++ in der hinsicht schlecht.

    Das geht so nicht, da die Daten beim Verlassen der Funktion ungültig
    werden und dein char* in die falsche Richtung zeigt.

    Warum legst Du nicht, wenn das denn schon sein muss, eine
    globale cbString-Instanz an und weisst dieser den Wert zu.
    Hört sich ein wenig nach einen Konzeptproblem an.

    Im übrigen ist "file" ein absolut "würgbrecherischer" Name weil
    er viel zu allgemein ist. Denk dran, dass es noch andere Programmierer
    neben dir gibt und nene das Ding wenigstens iniFileName oder ähnlich.

    Wenn Du den



  • MrVerzweifelt schrieb:

    ich öffen schon vorher eine ini und dadurch verliere ich meinen pfad zu dieser ini. ich will ihr deshalb mitteilen wo sich das hauptprogramm befindet und wo dort diese ini ist.

    Um zu wissen wo dein Hauptprogramm liegt nehm ich immer

    GetCommandLine()
    

    damit bekommst du Pfad\Haumichblau.exe . Damit kannst du dir den aktuellen Pfad deines Programms parsen oder den namen deiner exe.

    Was ich nicht verstehe ist, warum verlierst du den pfad zu deiner ini wenn du sie geöffnet hast?



  • [quote="TaelanUm zu wissen wo dein Hauptprogramm liegt nehm ich immer

    GetCommandLine()
    

    damit bekommst du Pfad\Haumichblau.exe . Damit kannst du dir den aktuellen Pfad deines Programms parsen oder den namen deiner exe.[/quote]Davon würde ich aber abraten, da es (einfache) Fälle gibt wo Du dies nicht bekommst...
    Um den Namen der EXE zu bekommen solltest Du

    GetModuleFileName(NULL, ...)
    

    aufrufen



  • Mja funktioniert auch, die Fehler hatte ich noch nicht daher kann ich dazu nichts sagen aber werds mal im Hinterkopf behalten.

    Habs mir auch grad mal angeschaut und es ist im Prinzip genauso zu benutzen wie GetCommandline() nur das man eben CString::GetBuffer(nMinBufLength) benutzen muss wenn man mit CString anstatt mit char arbeiten will



  • Taelan schrieb:

    die Fehler hatte ich noch nicht daher kann ich dazu nichts sagen

    Der Fehler ist ganz simpel: Wenn jemand Dein Process so startet:

    CreateProcess("Name-der-Exe.exe", "Deine schönenen Argumente", ...);
    

    dann hast Du ein kleines (grosses) Problem...


Anmelden zum Antworten