*이
답변
이 GetFileAttributes
를 사용 GetFileAttributesW
를 사용하지 마십시오. 모든 const 문자열에 _T
을 추가하고 _TCHAR*
을 사용하십시오. 그리고 INVALID_FILE_ATTRIBUES
는
if(GetFileAttributes(_T("C:\\Directory"))!= INVALID_FILE_ATTRIBUTES)
{...}
이
Unicode Programming Summary보기 ... 확실히
하지 문자열입니다.
아니면 그냥 L ""을 사용하고 ASCII 빌드는 잊어 버리시겠습니까? –
@MarkIngram 훌륭한 조언. – bames53
당신은 포인터가 아닌 주소를 비교하려고합니다!
확인 기능 : memcmp는 (...)
한 종류의 코드화 텍스트 리터럴과 다른 종류의 코드화 함수 호출을 혼합합니다.
이 모든 혼란은 마이크로 소프트가 자신의 헤더에 넣는 #define
및 typedef
의 모호한 사슬 때문입니다.
이 성가신 Microsoft 트릭 중 하나는 프로젝트 설정에 따라 A
또는 W
문자로 구분 된 두 개의 함수 호출을 선언하는 것입니다. UNICODE
이 정의 된 경우 GetFileAttributes
을 GetFileAttributesA
또는 GetFileAttributesW
으로 변환하는 매크로가 있습니다.
귀하의 경우 매크로를 제거하고 UNICODE
버전을 직접 호출하는 경우 (문자는 W
으로 끝남) 전화를 걸면 no-widestring 리터럴을 사용 중이므로 쉽게 수정할 수 있습니다
if(GetFileAttributesW(L"C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}
그래서, 당신은 A
끝났다 버전을 호출하는 경우, 당신은 더-WideString으로 그대로 사용할 수 없습니다 :
if(GetFileAttributesA("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}
을 (다른 사용자에 의해 제안) 리터럴에 L
를 추가 다른 방법은 t
if(GetFileAttributesW(_T("C:\\Directory"))!="INVALID_FILE_ATTRIBUTES") {...}
을하지만 UNICODE
가 정의되지 않은 경우, 원래 문제가 다시 상승 할 것이다 : O (this answer 확인)는 _T
매크로를 사용하고 수정 마지막으로, 당신은 일을 마이크로 소프트 방법에 항복하고 제공된 모든 매크로를 사용할 수 있습니다 : 두 개의 매크로를 사용
// Note the lack of W or A, it's a macro, not a function call!!
if(GetFileAttributes(_T("C:\\Directory"))!="INVALID_FILE_ATTRIBUTES") {...}
합니다 (UNICODE
또는 아니 - UNICODE
버전 GetFileAttributes
을 변경 한과를 추가 한을 리터럴에는 L
), 프로젝트 설정에 대해 걱정할 필요가 없습니다. 왜냐하면 매크로가 이러한 책임감을 지니기 때문입니다.
편집.
나쁘다. 나는 가장 중요한 부분을 거의 잊어 버린다.
다른 사용자가 가리키는 것처럼 GetFileAttributes
의 반환 값을 텍스트 리터럴과 비교하고 있습니다. 그것은 DWORD를 반환하고 Microsoft 설명서에 따라 :
A DWORD is a 32-bit unsigned integer (range: 0 through 4294967295 decimal).
그래서, 결국, 당신이 char[24]
와 정수를 비교하고, 비교는 가능하지만, 그것은 사실이 될하지 않습니다! 당신은 함수와 그것의 사용법에 대해 읽어야 만한다;)
'GetFileAttributesW'는'const char []'와 비교할 수없는 DWORD를 반환한다. 아마도 당신은'INVALID_FILE_ATTRIBUTES'을 인용하기를 원하지 않았을 것입니다. –
INVALID_FILE_ATTRIBUTES은 문자열이 아닌 정수 식별자입니다. 그 주위에서 따옴표를 제거해야합니다. –
@ Robᵩ Gosh, 정말 휴식해야합니다 ... 고마워요 ... – burtek