C++ 当从“替换”开始时;wcslen“;至;斯特伦“s”;,这是正确的打字方式吗;常量字符*“;?
将“wcslen”替换为“strnlen_s”时,使用C++ 当从“替换”开始时;wcslen“;至;斯特伦“s”;,这是正确的打字方式吗;常量字符*“;?,c++,c++11,casting,C++,C++11,Casting,将“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(API
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;
}
bool激活::执行()
{
HRESULT hr=S_正常;
类型定义ULONG(APIENTRY*ActivateNowProc)(int);
wchar_t szPath[MAX_PATH];
std::fill_n(szPath,MAX_PATH,L'\0');
//获取CSIDL程序文件路径
hr=SHGetFolderPath(NULL,CSIDL_程序_文件,NULL,NULL,szPath);
如果(成功(hr))
{
_tcscat_s(szPath,sizeof(szPath)/sizeof(TCHAR),MSC_PATH);
}
if(IsDirectoryExist(szPath))
{
std::wstringstream strActivationLibPath;
strActivationLibPath简短回答:不,这绝对不是正确的方法
原因:简单地将wchar\u t
字符串指针强制转换为char
指针不会改变字符串的内容;因为宽字符串的16位组件可能有“上限字节”恰好为零的元素,那么这将表示字符串过早结束。此外,即使不是这样,值strnlen\u s
返回的值将是所需值的两倍,因为它将每个16位wchar\u t
计算为两个8位char
值
解决方案:正如Mathieu所说,使用wcsnlen\u s
代替!始终将wcs…函数与wchar\u t
字符串一起使用,并始终将str…函数用于char
字符串
编辑:另外,我注意到您的代码中使用了\u tcscat\u s
。在未定义为TCHAR
的字符串上使用\u tcs…
函数时要小心,因为TCHAR
的计算结果是char
或wchar\u t
,具体取决于编译/构建设置。因此,添加:…和always为TCHAR
字符串使用_tcs…函数!简短回答:不,这绝对不是正确的方法
原因:简单地将wchar\u t
字符串指针强制转换为char
指针不会改变字符串的内容;因为宽字符串的16位组件可能有“上限字节”恰好为零的元素,那么这将表示字符串过早结束。此外,即使不是这样,值strnlen\u s
返回的值将是所需值的两倍,因为它将每个16位wchar\u t
计算为两个8位char
值
解决方案:正如Mathieu所说,使用wcsnlen\u s
代替!始终将wcs…函数与wchar\u t
字符串一起使用,并始终将str…函数用于char
字符串
编辑:另外,我注意到您的代码中使用了\u tcscat\u s
。在未定义为TCHAR
的字符串上使用\u tcs…
函数时要小心,因为TCHAR
的计算结果是char
或wchar\u t
,具体取决于编译/构建设置。因此,添加:…和always为TCHAR
字符串使用tcs…函数!我不确定在非char
字符串上使用strlen\s
是个好主意。IIRCwchart
是一个16位字符,您应该使用我不确定在非char
字符串上使用strlen\code>是个好主意。IIRCwchart
是一个16位字符,您应该使用或更好地完全避免使用@@@u s()
-函数。@重复数据消除器-是否使用MSVC的@@@@u s('safe')版本的字符串函数本身就是一个全新的对话!它们有点像Marmite。或更好地避免使用@@@u s()
-完全是函数。@重复数据消除器-是否使用MSVC的@@@s(“安全”)版本的字符串函数本身就是一个全新的话题!它们有点像Marmite。