2014-09-26 7 views
0

다운로드 한 코드에서 C++ 메소드를 다시 작성합니다. 이 메서드는 원래 PCWSTR을 매개 변수로 사용하고 사용자에게 파일 이름을 입력하라는 메시지를 표시했습니다. 두 개의 매개 변수 (둘 다 PCWSTR)를 사용하고 사용자에게 프롬프트를 표시하지 않도록 메소드를 수정했습니다. 이미 다른 파일 목록을 생성 중입니다. 파일의 목록을 반복하는 내 메서드에서 두 매개 변수를 사용하여 새 (수정 된) 메서드를 호출하려고합니다.PCWSTR이 있어야하며 WCHAR이되어야합니다. []

원본 메서드는 사용자에게 StringCBGetsW 명령을 사용하여 입력을 요구했습니다. 이처럼 ...

HRESULT  tst=S_OK;   //these are at the top of the method 
WCHAR  fname[85] = {0}; //these are at the top of the method 
tst = StringCbGetsW(fname,sizeof(fname)); 

WCHAR 에 fname은 더 아래 또 다른 반복 메서드에 전달됩니다. 그 방법을 보면, 그것은 LPCWSTR 타입이라고 말합니다; 대신 WCHAR을 대신 사용할 수 있다고 가정합니다.

하지만 할 수없는 것은 메서드가 전달 된 PCWSTR입니다. 내 궁극적 인 목표는 사용자에게 파일 이름을 묻지 않고 이전에 다른 방법으로 반복 된 파일 이름 대신 사용하는 것입니다.

tl; 나는 PCWSTR을 가지고 있고 그것은 WCHAR로 변환 될 필요가있다. 나는 WCHAR []이 무엇인지, 어떻게 그것으로 무엇을해야할지 모른다. 그것이 무엇인지보기 위해 printf을 시도하는 것을 포함합니다.

추신 : 저는 파일을 옮기고 복사하는 더 쉬운 방법이 있다는 것을 알고 있습니다. 프로그램을 사용하여이 작업을 시도하는 이유가 있습니다.

+0

'LPCWSTR'은'PCWSTR'와 같은 것입니다. –

+0

IIRC는 끔찍한 헝가리 표기법은 const'WCHAR' 리터럴에 대한 포인터로서'PCWSTR'을 나타냅니다. 'WCHAR'에 접근하기 위해서는 그것을 역 참조 할 필요가있을 것입니다. –

+1

'WCHAR []'은 암시 적으로'PCWSTR'로 변환 가능합니다; 코드를 설명하는 대신 코드를 표시하여 실제 문제가 어디에 있는지 확인할 수 있습니까? 즉, [MCVE] (http://stackoverflow.com/help/mcve)를 게시하십시오. – Angew

답변

6

우선, 일부 Windows 특정 유형에 약간의 명료성을 부여하겠습니다.

WCHARwchar_t의 typedef입니다.
Microsoft Visual C++이 설치된 Windows에서 16 비트 문자 유형 (유니 코드 UTF-16 문자열에 사용할 수 있음)입니다.

PCWSTRLPCWSTR 같은 일에 대한 두 개의 서로 다른 이름입니다 : 그들은 const wchar_t*을 위해 기본적으로 typedef들입니다.

LPCWSTR의 초기 L은 다음 P 읽을 일부 기존 접두사 "긴 포인터"을 의미합니다. 필자는 Windows 95 및 Win32로 시작한 적이 있지만 16 비트 Windows에서는 포인터가 및 근처에 있거나 인 포인터 근처에 과 같은 것이 있다는 것을 알고 있습니다. 이제는 단 하나의 유형의 포인터 만 있으므로 접두어 L을 생략 할 수 있습니다.

P"포인터"을 나타냅니다.
C"상수"을 나타냅니다.WCHAR/wchar_t, 그리고 마지막으로에 대한
W 스탠드는 STR 부분은 "문자열"을 의미합니다.

이렇게 "헝가리 표기법"을 디코딩하면, PCWSTRconst wchar_t*을 의미합니다.
기본적으로 이는 읽기 전용 NUL- 종단 wchar_t 유니 코드 UTF-16 문자열에 대한 포인터입니다.

이 정보로 문제를 해결할 수 있습니까?

당신이 wchar_t 문자열 버퍼 및 PCWSTR을 기대하는 기능이있는 경우, 당신은 단지 함수에 (첫 번째 문자의 주소를 해당) 버퍼의 이름을 전달할 수 있습니다 :

WCHAR buffer[100]; 
DoSomething(buffer, ...); // DoSomething(PCWSTR ....) 

을 때로는 일반적으로 출력 문자열 매개 변수의 경우 대상 문자열 버퍼의 크기 (예 : "용량")를 지정할 수도 있습니다.
이 크기 (S wchar_t에서 본 경우) 문자의 수를 사용하여 표현되는 경우, 통상는 Win32 헝가리어 표기법 cch (
"카운트 문자")이고; 그렇지 않으면 크기를 바이트로 표시하려면 보통 접두사는 cb ("카운트 바이트")입니다.
따라서 StringCchCopy()과 같은 기능을 사용하는 경우 Cch 부분에서 크기가 문자로 표시됩니다 (wchar_t 초).

_countof()을 사용하면 wchar_t에 버퍼 크기를 얻을 수 있습니다.
예 : 위의 코드에서 buffer은 100 wchar_t으로 만들어 졌으므로 _countof(buffer) == 100입니다. 대신 sizeof(buffer) == 200인데, 각 wchar_t은 2 바이트 == 16 비트이기 때문에 바이트 단위의 총 버퍼 크기는 100 [wchar_t] * 2 [bytes/wchar_t] = 200 [bytes]입니다.

+0

고마워요. 이것은 모든 데이터 유형에 대한 설명과 그 데이터 유형과 관련하여 가장 이해가됩니다. –

+0

@NickO : 천만에. 도움이 된 것을 기쁘게 생각합니다. –