首页 文章

错误C2664:'errno_t wcstombs_s(size_t *,char *,size_t,const wchar_t *,size_t)':无法转换参数4

提问于
浏览
0

错误C2664:'errno_t wcstombs_s(size_t *,char *,size_t,const wchar_t *,size_t)':无法将参数4从'CHAR [260]'转换为'const wchar_t *'1>指向的类型不相关;转换需要reinterpret_cast,C风格的转换或函数式转换

这个错误是什么意思?

我的职责是:

BOOL DependentDLLDisplay()
{
    char arr[200];

    if(!Module32First(hProcessSnap,&me32))
    {
        cout<<" ERROR : Failed to Get DLL Information"<<endl;
        CloseHandle(hProcessSnap);
        return FALSE;
    }

    cout<<endl<<"DEPENDENT DLL OF THIS PROCESS :"<<endl;
    do
    {
        wcstombs_s(NULL,arr,200,me32.szModule,200);
        cout<<arr<<endl;
    }while(Module32Next(hProcessSnap,&me32));

    CloseHandle(hProcessSnap);
    return TRUE;
}

1 回答

  • 1

    您的对象 me32 的类型为 MODULEENTRY32 ,如下所示:

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms684225.aspx

    作为第4个参数传递给'wcstombs_sszModule` 字段定义为:

    TCHAR   szModule[MAX_MODULE_NAME32 + 1];
    

    在Windows API中, TCHAR 在MBCS编码中定义为 char ,在UNICODE编码中定义为 wchar .

    您看到的错误表明您正在包含Windows库的MBCS版本,因此 MODULEENTRY32 实际上是 MODULEENTRY32A 并且 me32.szModulechar[] ,但是当它实际上是 me32.szModule 时就像它是一个宽 wchar_t[] 字符串一样一个Ansi char[] 字符串 .

    您可以通过更改项目设置或使用普通的 char 字符串副本切换到UNICODE库,以获取该字段的值 .

    或者,正如雷米所说:

    或者,您可以显式使用Module32FirstW()/ Module32NextW(),MODULEENTRY32W,std :: wcout等,或者显式使用Module32FirstA()/ Module32NextA(),MODULEENTRY32A等 . 无论哪种方式,您都不必更改项目设置 . 不要再使用基于TCHAR的API . 在这种情况下,由于代码想要以char []字符串结束,因此使用Module32FirstA()/ Module32NextA()并完全删除wcstombs_s()是有意义的 .

    最后一点:您应该将局部变量扩展为 szModule 的相同大小,而不是可能截断内容 .

相关问题