![](/img/trans.png)
[英]What is the correct way to handle nullptr const char* when using const std::string& as method argument type?
[英]When replacing from “wcslen” to “strnlen_s”, is it the correct way to typecast with “const char*”?
从“ 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
计算结果为char
或wchar_t
,具体取决于您的编译/生成设置。 因此,添加:…始终对TCHAR
字符串使用_tcs…函数!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.