2009-10-07 4 views
0

Visual C++에서 win32 API 응용 프로그램이 있습니다. Application Common Data Directory에 디렉토리를 만들고 싶습니다. 다음과 같은 오류가 발생하는 코드가 있습니다. 또한 문자열 끝에 '\ 0'을 추가하려고했지만 동일한 오류가 나타납니다.응용 프로그램 공통 데이터 디렉토리에 디렉토리 만들기

디버그 어설 션이 실패했습니다! 식 : (L "문자열이 NULL로 종료되지 않았습니다"& & 0);

번호 :

TCHAR APPDIR [MAX_PATH]; TCHAR SetPath [MAX_PATH];

ITEMIDLIST * pidl; HRESULT hRes = SHGetSpecialFolderLocation (NULL, CSIDL_COMMON_APPDATA | CSIDL_FLAG_CREATE, & pidl); if (hRes == NOERROR) { SHGetPathFromIDList (pidl, AppDir); }

strcpy_s (SetPath, AppDir);

:: strcat_s (SetPath, "\ Keylogger"); :: SHCreateDirectoryExW (hWnd, (LPCWSTR) SetPath, NULL);

:: strcat_s (SetPath, "\ SnapShot"); :: SHCreateDirectoryExW (hWnd, (LPCWSTR) SetPath, NULL);

답변

1

큰 문제는 SHCreateDirectoryExW 호출에서 (LPCWSTR) 캐스트입니다. 이러한 캐스트는 오류가 무엇인지 알려주는 컴파일러를 명시 적으로 차단합니다.

프로그래머가 이해할 수있는 C++ 프로그래머가 많으면 좋겠다. 타입 변환하지 마라. 이유를 이해하지 않는 한. 컴파일러 오류를 '수정'하지 않으려면 다음을 수행하십시오. - 오류를 수정하지 않은 시간의 99 %는 방금 숨겨졌습니다.

처음부터 코드 분석 : TCHAR을 사용하면 UNICODE (텍스트는 16 비트 WCHAR 필드에 저장 됨) 또는 ANSI 빌드 (텍스트는 8 비트 CHAR 필드에 저장 됨)를 대상으로 할 수있는 코드를 작성한다는 의미입니다. 그러나 strxxx_s 함수의 str 접두어는 8 비트 문자열 만 처리하는 문자열 함수를 사용하고 있음을 의미합니다. W 's on the Shell 함수는 Windows API가 UNICODE 문자열을 기대하는 함수를 광고하는 방법입니다.

프로그램을 '수정'하려면 컴파일러 설정에 따라 (a) 대상 ANSI, (b) 대상 UNICODE 또는 (c) 대상 중 하나를 선택하고 적절하게 다시 작성해야합니다. 'both'옵션은 다음과 같이 쓰여집니다 :

TCHAR AppDir[MAX_PATH]; 
TCHAR SetPath[MAX_PATH]; 
ITEMIDLIST* pidl; 
HRESULT hRes = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_APPDATA|CSIDL_FLAG_CREATE ,&pidl); 
SHGetPathFromIDList(pidl, AppDir); 
_tcscpy_s(SetPath,AppDir); 
_tcscat_s(SetPath,_T("\Keylogger")); 
SHCreateDirectoryEx(hWnd,SetPath,NULL); 
_tcscat_s(SetPath,_T("\SnapShot")); 
SHCreateDirectoryEx(hWnd,SetPath,NULL); 

(부정확 한) 타입 변환이 삭제되었습니다. strxxx_s 기능을 _tcsxxx_s 버전으로 바꿨습니다. 그리고 _T() 매크로에 문자열 리터럴을 래핑하면 _UNICODE이 정의되어있을 때 문자열이 넓은 문자열이되고 다른 경우에는 일반 ansi 문자열이됩니다.

+0

귀중한 의견을 보내 주셔서 감사합니다. –

0

단일 바이트 및 유니 코드 문자열 기능을 혼합하는 것으로 보입니다.

strcpy_sstrcat_s는 싱글 바이트 캐릭터

SHCreateDirectoryExW 사용되는 유니 코드 문자열을 넓게 사용된다.

SHCreateDirectoryEx를 사용해보십시오.

+0

예! 당신 말이 맞아요, 고마워요. 귀하의 신속하고 정확한 코멘트. –

관련 문제