繁体   English   中英

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

[英]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计算结果为charwchar_t ,具体取决于您的编译/生成设置。 因此,添加:…始终对TCHAR字符串使用_tcs…函数!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM