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

时间:2017-01-10 21:47:18

标签: c++ winapi

  

错误C2664:' errno_t wcstombs_s(size_t *,char *,size_t,const wchar_t *,size_t)' :无法从' CHAR [260]'转换参数4 to' const wchar_t *' 1 GT;
  指向的类型是无关的;转换需要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 个答案:

答案 0 :(得分:1)

您的对象me32属于此处定义的MODULEENTRY32类型:

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

您作为第4个参数传递给&#39; wcstombs_s`的szModule字段定义为:

TCHAR   szModule[MAX_MODULE_NAME32 + 1];

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

您看到的错误表明您正在包含Windows库的MBCS版本,因此MODULEENTRY32实际上是MODULEENTRY32Ame32.szModulechar[],但是然后尝试将me32.szModule视为宽wchar_t[]字符串,当它实际上是一个Ansi char[]字符串时。

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

或者,正如雷米所说:

  

或者,您可以明确使用Module32FirstW() / Module32NextW(),   MODULEENTRY32Wstd::wcout等,或明确使用   Module32FirstA() / Module32NextA()MODULEENTRY32A等。无论哪种方式,你   不必更改项目设置。不要使用基于TCHAR的API   了。在这种情况下,由于代码想要以char[]结束   字符串,使用Module32FirstA() / Module32NextA()和   只需完全删除wcstombs_s()

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