2010-11-19 15 views
0

Ich verwende wcstombs_s in meinem Code, um CString zu char* zu konvertieren. Hier ist Code:wcstombs_s funktioniert nicht richtig

AddItemToListIncludeSubFolder(CString FolderPath, CString Parent) 
    { 
    char szInputPath[1024]; 

    memset(szInputPath,1024,'\0'); 
    size_t CharactersConverted=0; 

    wcstombs_s(&CharactersConverted, szInputPath, FolderPath.GetLength()+1, 
     FolderPath, _TRUNCATE); 
    } 

Es löst Ausnahme einige Zeit. Speicherausnahme ist wcstombs_s funktioniert nicht, wenn CString ist zu lang wie 1024 Zeichen oder ich mache etwas falsch.

+1

Stellen Sie bitte ein komplettes kleines Programm vor, das den Fehler anzeigt. Wie Ihr Code gerade ist, haben Sie zwei "memset" Aufrufe, auf Variablen, die nicht in Ihrem Aufruf von 'wcstombs_s' verwendet werden. Das ist nur Lärm, soweit es dein Problem erklärt. –

+0

BOOL CPDF2ImageDlg :: DeleteItemFromListIncludeSubFolder (CString FolderPath, CString Eltern) { \t MSG msg; \t HANDLE hFile; \t WIN32_FIND_DATAA lpFile; \t Zeichen FilePath [MAX_PATH_LENTH]; \t char szInputPath [MAX_PATH_LENTH]; \t \t size_t CharactersConverted = 0; \t memset (Dateipfad, MAX_PATH_LENTH, '\ 0'); \t memset (szInputPath, MAX_PATH_LENTH, '\ 0'); \t wcstombs_s (& CharactersConverted, szInputPath, FolderPath.GetLength() + 1, FolderPath, _TRUNCATE); –

+0

Hallo, ich habe den Code bearbeitet, den Sie jetzt überprüfen können. Es erhöht Laufzeit Ausnahme einige Zeit, die Speicher betreffen. –

Antwort

0

sollte wcstombs_s (& CharactersConverted, szInputPath, 1023, FolderPath.GetString(), _TRUNCATE); der dritte Parameter ist die Puffergröße von szInputPath, auch FolderPath Länge länger sein als 1024, ist diese Funktion noch nicht Ausnahme werfen

+0

Ich habe das gleiche gemacht, aber das Problem war immer noch auftauchen. –

3

Der dritte Parameter von wcstombs_s ist die Größe des Ausgangspuffers, nicht die Größe der Zeichenfolge zu sein umgewandelt. Wenn FolderPath länger als 1024 Zeichen ist, schreiben Sie Speicher außerhalb der Grenzen, da wcstombs_s denkt, dass es einen größeren Puffer hat als es tut.

Versuchen Sie stattdessen:

wcstombs_s(&CharactersConverted, szInputPath, sizeof(szInputPath), 
    FolderPath, _TRUNCATE); 
0

CString #defined basiert auf whther die UNICODE definieren festgelegt ist. Ist dies der Fall, wird CString in CStringW in CStringA übersetzt. Die Sache ist perfekt, diese Klassen direkt zu benutzen. Außerdem führen sie die Umrechnung zwischen dem 2.

Also, wenn Sie den folgenden Code schreiben:

CStringA ansiAstring(wideString); 
char* ansiCStr = ansiString.GetString(); 

Seine so einfach.

1

Sie verwenden Memset auch falsch, Sie haben den zweiten und dritten Parameter vertauscht.