错误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;
}
答案 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
实际上是MODULEENTRY32A
而me32.szModule
是char[]
,但是然后尝试将me32.szModule
视为宽wchar_t[]
字符串,当它实际上是一个Ansi char[]
字符串时。
您可以通过更改项目设置或使用普通char
字符串副本切换到UNICODE库,以获取该字段的值。
或者,正如雷米所说:
或者,您可以明确使用
Module32FirstW()
/Module32NextW()
,MODULEENTRY32W
,std::wcout
等,或明确使用Module32FirstA()
/Module32NextA()
,MODULEENTRY32A
等。无论哪种方式,你 不必更改项目设置。不要使用基于TCHAR
的API 了。在这种情况下,由于代码想要以char[]
结束 字符串,使用Module32FirstA()
/Module32NextA()
和 只需完全删除wcstombs_s()
。
最后一点:您应该将局部变量扩展为szModule
的相同大小,而不是可能截断内容。