错误 C2664:"errno_t wcstombs_s(size_t *,字符 *,size_t,常量 wchar_t *,size_t)":无法转换参数 4

error C2664: 'errno_t wcstombs_s(size_t *,char *,size_t,const wchar_t *,size_t)' : cannot convert parameter 4

本文关键字:size 转换 参数 wchar 字符 wcstombs 错误 errno C2664 常量      更新时间:2023-10-16

错误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;
}

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

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

作为"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[]字符串,而实际上它是Ansichar[]字符串。

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

或者,正如雷米所说:

或者,您可以显式使用Module32FirstW()/Module32NextW()MODULEENTRY32Wstd::wcout等,或显式使用Module32FirstA()/Module32NextA()MODULEENTRY32A等。不管怎样,你不必更改项目设置。不要使用基于TCHAR的API不再在这种情况下,由于代码希望以char[]结束字符串,使用Module32FirstA()/Module32NextA()和只需完全去除CCD_ 26即可。

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