배열은 Visual C ++에서 GetVolumeInformation에서 검색 한 이름을 저장합니다.
-
15-09-2020 - |
문제
GetVolumeInformation 호출을 사용하여 이동식 장치의 이름을 검색하고 싶습니다.나는 그 이름을 잘 검색하고 TCHAR 배열 변수 szvolnamebuff에 저장할 수 있습니다.다음은 그 코드입니다.
// Get Volume Information to check for NTFS or FAT
TCHAR szFileSys[256];
TCHAR szVolNameBuff[256];
DWORD dwSerial = 0;
DWORD dwMFL = 0;
DWORD dwSysFlags = 0;
bool bSuccess;
char fileType[255];
int bSuccessdebug = 0;
//LPCTSTR temp = _T("E:\\"); For debugging only
bSuccess = GetVolumeInformation(drivePath,
szVolNameBuff,
sizeof(szVolNameBuff),
&dwSerial,
&dwMFL,
&dwSysFlags,
szFileSys,
sizeof(szFileSys));
.
라인과 변수의 내용을 인쇄하려고 할 때 :
printf("szVolNameBuff holds: %s \n", &szVolNameBuff);
.
드라이브의 이름 인 "Transcend"라는 이름 대신 "T"의 출력을 얻습니다.Visual Studio 2008으로 디버깅하고 Tchar 배열이 이름을 다음과 같이 저장한다는 것을 알았습니다. [0] 'T' [1] 0. [2] 'r' [3] 0. [4] 'A' [5] 0. [6] 'n' [7] 0
등등.왜 그런 겁니까?배열이 단어를 단순한 단어를 저장하고 싶습니다.
[0] 'T' [1] 'r' [2] 'A' [3] 'n' [4] 's'
나중에 문자열 연결에 사용하십시오.이 문제를 해결할 수있는 방법이 있습니까?
해결책
유니 코드 Win32 API를 사용하는 것처럼 보입니다.해당 함수 (PRINTF 또는 WPRINTF)가 문자 유형에 따라 사용되도록 _TPRINTF를 사용해야합니다.
유니 코드를 모르는 경우 - 여기에 빠르게 개요가 있습니다.이 일이 일어나고있는 이유는 일반 ASCII 문자의 유니 코드가 NULL 바이트 다음 ASCII 문자가 오는 것입니다.이것이 당신이 당신이 null로 패딩 된 문자열을보고있는 이유입니다.
TCHAR을 사용할 때 _t () 매크로의 모든 문자열을 랩핑하여 올바른 유형으로 선언되도록해야합니다.일관되게이를 따르면 유니 코드에서 ANSI로 변환하는 것이 전처리기구 지침을 변경하는 문제 일뿐입니다.
다른 팁
Win32 API의 유니 코드 버전을 사용하고있는 이유는 무엇입니까?
와 2 개의 수정 사항이 있습니다.첫 번째는 프로젝트의 문자 집합을 프로젝트 -> 속성 -> 구성 등록 정보 -> 일반 -> 문자 집합에서 '설정되지 않음'으로 변경하여 Visual Studio를 사용하는 경우 API의 표준 버전을 사용하는 것입니다.vs를 사용하지 않으면 유니 코드가 #defined가 #defined되지 않았는지 확인하십시오.
MDMA가 말했듯이 두 번째 수정 사항은 표준 라이브러리에서 유니 코드 텍스트 조작 기능 WPrintf를 사용하거나 % s를 사용하는 것입니다.이 프로그램이 프로그램이 국제화 친숙 해지고 파일 이름을 사용하고있는 문자 집합에 대해서는 업무를 수행 할 수있는 기본 수정 프로그램입니다.그러나 모든 다운 스트림 기능은 유니 코드를 사용할 필요가 있음을 의미합니다. 프로젝트의 크기에 따라 많은 작업을 의미 할 수 있습니다.