*이

2012-10-04 3 views
1

이 같은 뭔가를 DWORD GetFileAttributesW (const WCHAR *) '*이

const char*const WCHAR*으로 변환하는 방법?

+2

'GetFileAttributesW'는'const char []'와 비교할 수없는 DWORD를 반환한다. 아마도 당신은'INVALID_FILE_ATTRIBUTES'을 인용하기를 원하지 않았을 것입니다. –

+1

INVALID_FILE_ATTRIBUTES은 문자열이 아닌 정수 식별자입니다. 그 주위에서 따옴표를 제거해야합니다. –

+0

@ Robᵩ Gosh, 정말 휴식해야합니다 ... 고마워요 ... – burtek

답변

3

GetFileAttributes를 사용 GetFileAttributesW를 사용하지 마십시오. 모든 const 문자열에 _T을 추가하고 _TCHAR*을 사용하십시오. 그리고 INVALID_FILE_ATTRIBUES

if(GetFileAttributes(_T("C:\\Directory"))!= INVALID_FILE_ATTRIBUTES) 
{...} 

Unicode Programming Summary보기 ... 확실히 하지 문자열입니다.

+1

아니면 그냥 L ""을 사용하고 ASCII 빌드는 잊어 버리시겠습니까? –

+0

@MarkIngram 훌륭한 조언. – bames53

0

당신은 포인터가 아닌 주소를 비교하려고합니다!

확인 기능 : memcmp는 (...)

1

한 종류의 코드화 텍스트 리터럴과 다른 종류의 코드화 함수 호출을 혼합합니다.

이 모든 혼란은 마이크로 소프트가 자신의 헤더에 넣는 #definetypedef의 모호한 사슬 때문입니다.

이 성가신 Microsoft 트릭 중 하나는 프로젝트 설정에 따라 A 또는 W 문자로 구분 된 두 개의 함수 호출을 선언하는 것입니다. UNICODE이 정의 된 경우 GetFileAttributesGetFileAttributesA 또는 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]와 정수를 비교하고, 비교는 가능하지만, 그것은 사실이 될하지 않습니다! 당신은 함수와 그것의 사용법에 대해 읽어야 만한다;)