gpt4 book ai didi

c++ - 从 "wcslen"替换为 "strnlen_s"时,使用 "const char*"进行类型转换是否正确?

转载 作者:行者123 更新时间:2023-11-28 01:18:49 27 4
gpt4 key购买 nike

从“wcslen”替换为“strnlen_s”时,使用const char* 进行类型转换是否正确?

在下面的函数中我正在替换

if (szPath[wcslen(szPath) - 1] != L'\\')

if (szPath[strnlen_s((const char*)szPath, sizeof(szPath)) - 1] != L'\\')

下面是代码片段:

bool Activation::Execute()
{
HRESULT hr = S_OK;
typedef ULONG(APIENTRY *ActivateNowProc)(int);

wchar_t szPath[MAX_PATH];

std::fill_n(szPath, MAX_PATH, L'\0');
//Gets the CSIDL Program files path
hr = SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, NULL, szPath);
if (SUCCEEDED(hr))
{
_tcscat_s(szPath, sizeof(szPath) / sizeof(TCHAR), MSC_PATH);
}

if (IsDirectoryExist(szPath))
{
std::wstringstream strActivationLibPath;
strActivationLibPath << szPath;
//if (szPath[wcslen(szPath) - 1] != L'\\')
if (szPath[strnlen_s((const char*)szPath, sizeof(szPath)) - 1] != L'\\')
strActivationLibPath << L"\\";
strActivationLibPath << OOBE_FOLDER_NAME << L"\\" << ACTIVATION_LIB_NAME;

DWORD dwErr = McValidateModule(strActivationLibPath.str().c_str());
if (dwErr != ERROR_SUCCESS)
{
return false;
}

HMODULE hModule = LoadLibrary(strActivationLibPath.str().c_str());
if (hModule == 0)
{
return false;
}

ActivateNowProc ActivateNow = (ActivateNowProc)GetProcAddress(hModule, ACTIVATION_PROC_NAME);
if (ActivateNow)
{
long retVal = ActivateNow(1);
if (retVal == E_FAIL)
{
FreeLibrary(hModule);
return false;
}
else
{
::Sleep(2000);
CheckProcessRunningAndWait(SYNCPROCESSNAME);
}
}
else
{
FreeLibrary(hModule);
return false;
}
FreeLibrary(hModule);
return true;
}
return false;
}

最佳答案

简短回答:不,这绝对不是正确的方法!

原因:简单地将 wchar_t 字符串指针转换为 char 指针不会改变字符串的内容;由于宽字符串的 16 位组件可能包含其“高位字节”恰好为零的元素,因此这将表示字符串过早结束。此外,即使不是这种情况,strnlen_s 返回的值也将是您想要的值的两倍,因为它将每个 16 位 wchar_t 计为两个 8-位 char 值。

解决方案:正如Mathieu所说,改用wcsnlen_s!始终对 wchar_t 字符串使用 wcs... 函数,并始终对 char 字符串使用 str... 函数。

编辑:另外,我注意到您在代码中使用了 _tcscat_s。在未定义为 TCHAR 的字符串上使用 _tcs… 函数时要小心 - 因为 TCHAR 计算为 charwchar_t,具体取决于您的编译/build设置。因此,添加:...并始终使用 _tcs... TCHAR 字符串的函数!

关于c++ - 从 "wcslen"替换为 "strnlen_s"时,使用 "const char*"进行类型转换是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57673358/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com