c++17 부터 data()의 리턴값에 const가 제외되었습니다. (대신 c++20에서 constexpr가 붙네요 왜 없앴냐)
그래서 windows api 사용 시 매개변수를 통해 문자열 데이터를 받아 올 경우 LPWSTR 매개변수로 사용 가능하게 되었죠.
int main()
{
std::wstring originalPath = L"%SystemRoot%\\SomeFolder\\SomeFile.txt";
wchar_t expandedPath[MAX_PATH]{ 0 };
// 환경 변수를 확장하여 치환된 경로를 얻습니다.
ExpandEnvironmentStringsW(originalPath, expandedPath, MAX_PATH);
originalPath = expendedPath;
std::wcerr << L"test: " << originalPath << std::endl;
return 0;
}
test1: C:\Windows\SomeFolder\SomeFile.txt
.data()
함수를 사용하여 한번에 받아오는것이 가능해짐int main()
{
std::wstring originalPath = L"%SystemRoot%\\SomeFolder\\SomeFile.txt";
// 환경 변수를 확장하여 치환된 경로를 얻습니다.
ExpandEnvironmentStringsW(originalPath, originalPath.data(), MAX_PATH);
std::wcerr << L"test: " << expandedPath << std::endl;
return 0;
}
test1: C:\Windows\SomeFolder\SomeFile.txt
이와 같이 큰 문제가 없이 동작하여 환경변수를 실제 경로로 변환해주는 ExpandEnvironmentStringsW에 적용하여 사용 중에 있었습니다.
동일한 코드 방식으로 %SystemRoot%
대신 %ProgramFiles(x86)%
값이 매개변수로 들어 간 상황에서의 결과는 이전과는 판이하게 달랐습니다.
test: C:\Program Files (x86)86)86)86)86)86)86)86)86)
ExpandEnvironmentStringsW
의 리턴값인 value도 정상적으로 나타납니다.
이런저런 테스트를 해 보다가 결국 기존 방식대로의 접근은 문제가 없이 정상적으로 나타남을 확인하였습니다.
int main()
{
std::wstring originalPath = L"%ProgramFiles(x86)%\\SomeFolder\\SomeFile.txt";
wchar_t expandedPath[MAX_PATH]{ 0 };
// 환경 변수를 확장하여 치환된 경로를 얻습니다.
ExpandEnvironmentStringsW(originalPath, expandedPath, MAX_PATH);
originalPath = expendedPath;
std::wcerr << L"test: " << originalPath << std::endl;
return 0;
}
test: C:\Program Files (x86)\SomeFolder\SomeFile.txt
알 수 없어요.
함수 내부를 까볼수도 없는 상황이라 무엇이 문제인지 현재로써는 알 수 없는 상황입니다. 구조상 std::wstring
쪽의 이슈 가능성이 더 커보입니다.
테스트 과정에서 추가로 알게 된 것은 wide string이 아닌 string을 사용했다면 std::string::data()
는 함수 실행 자체가 실패합니다. 처음부터 적용을 안 했을것 같네요