2010-11-19 2 views
0

내 코드에 wcstombs_s을 사용하여 CStringchar*으로 변환합니다. 코드는 다음과 같습니다.wcstombs_s이 (가) 제대로 작동하지 않습니다.

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); 
    } 

일부 예외가 발생합니다. 메모리 예외. CString이 너무 길어서 1024 문자가 아닐 때 wcstombs_s이 작동하지 않거나 잘못되었습니다.

+1

오류를 보여주는 완전한 소형 프로그램을 제시하십시오. 여러분의 코드가 바로 지금'wcstombs_s '에 대한 호출에서 사용되지 않는 변수에 두 개의'memset' 호출을 가지고 있습니다. 문제가 설명 될 때까지는 소음 일뿐입니다. –

+0

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

+0

안녕하세요, 지금 확인할 수있는 코드를 수정했습니다. 메모리와 관련된 런타임 예외가 발생합니다. –

답변

0

은 wcstombs_s (& CharactersConverted, szInputPath, 1023, FolderPath.GetString(), _TRUNCATE)를 사용해야합니다. 세번째 파라미터는 버퍼 szInputPath의 크기도 FolderPath의 길이는,이 함수는 여전히 문자열의 하지 크기로, 예외

+0

나는 똑같이했으나 문제는 여전히 발생했다. –

3

wcstombs_s 세번째 파라미터는 상기 출력 버퍼의 크기 버리지 1,024 초과 인 변환. FolderPath이 1024 문자보다 길면 wcstombs_s은 버퍼보다 ​​더 큰 버퍼를 가지고 있기 때문에 범위를 벗어난 메모리를 쓰고 있습니다.

대신을 시도해보십시오

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

CString을은 유니 코드가 설정되어 정의 whther에 따라 #define에 의해 정의된다. 설정되어 있으면 CString은 CStringW로, 그렇지 않으면 CStringA로 변환됩니다. 이 클래스를 직접 사용하는 것은 완벽하게 유효합니다. 과 간단하게

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

그것 : 또한 그들은 다음과 같은 코드를 작성 그래서 경우 2.

간의 변환을 수행합니다.

1

또한 memset을 잘못 사용하고 있으며 두 번째와 세 번째 매개 변수를 바꿨습니다.

관련 문제