C++ 当从“替换”开始时;wcslen“;至;斯特伦“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

将“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;
}
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
是个好主意。IIRC
wchart
是一个16位字符,您应该使用我不确定在非
char
字符串上使用
strlen\code>是个好主意。IIRC
wchart
是一个16位字符,您应该使用或更好地完全避免使用
@@@u s()
-函数。@重复数据消除器-是否使用MSVC的@@@@u s('safe')版本的字符串函数本身就是一个全新的对话!它们有点像Marmite。或更好地避免使用
@@@u s()
-完全是函数。@重复数据消除器-是否使用MSVC的@@@s(“安全”)版本的字符串函数本身就是一个全新的话题!它们有点像Marmite。