C++ 类型为“的参数”;PROCESSENTRY32W*”;与类型为“的参数不兼容”;LPPROCESSENTRY32“;

C++ 类型为“的参数”;PROCESSENTRY32W*”;与类型为“的参数不兼容”;LPPROCESSENTRY32“;,c++,winapi,visual-studio-2015,C++,Winapi,Visual Studio 2015,这是我的密码: std::uint32_t find(const wchar_t* proc) { auto snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); auto pe = PROCESSENTRY32W{ sizeof(PROCESSENTRY32W) }; if (Process32First(snapshot, &pe)) { do { if

这是我的密码:

std::uint32_t find(const wchar_t* proc)
{
    auto snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    auto pe = PROCESSENTRY32W{ sizeof(PROCESSENTRY32W) };

    if (Process32First(snapshot, &pe)) {
        do {
            if (!_wcsicmp(proc, pe.szExeFile)) {
                CloseHandle(snapshot);
                return pe.th32ProcessID;
            }
        } while (Process32Next(snapshot, &pe));
    }
    CloseHandle(snapshot);
    return 0;
}

我得到错误类型为“PROCESSENTRY32W*”的参数与类型为“LPPROCESSENTRY32”的参数不兼容。我的Visual studio设置设置为使用多字节字符集。如果我把它改成unicode,它会破坏我的整个项目。此错误是什么意思?如何修复代码?

您应该使用多字节版本的
PROCESSENTRY32
结构,而不是宽字符:

std::uint32_t find(const char* proc)
{
    auto snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    auto pe = PROCESSENTRY32{ sizeof(PROCESSENTRY32) };

    if (Process32First(snapshot, &pe)) {
        do {
            if (!_stricmp(proc, pe.szExeFile)) {
                CloseHandle(snapshot);
                return pe.th32ProcessID;
            }
        } while (Process32Next(snapshot, &pe));
    }
    CloseHandle(snapshot);
    return 0;
}

您应该使用多字节版本的
PROCESSENTRY32
结构,而不是宽字符:

std::uint32_t find(const char* proc)
{
    auto snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    auto pe = PROCESSENTRY32{ sizeof(PROCESSENTRY32) };

    if (Process32First(snapshot, &pe)) {
        do {
            if (!_stricmp(proc, pe.szExeFile)) {
                CloseHandle(snapshot);
                return pe.th32ProcessID;
            }
        } while (Process32Next(snapshot, &pe));
    }
    CloseHandle(snapshot);
    return 0;
}


PROCESSENTRY32W
(宽字符)替换为
PROCESSENTRY32
(多字节),然后它就会工作。我像你说的那样替换了它,但现在我得到了:'int\u wcsicmp(const wchar\u t*,const wchar\u t*):无法将参数2从'CHAR[260]转换为'const wchar\u t*'和:'CHAR*类型的参数与类型为“const wchar\u t*”的参数不兼容。如果项目配置为使用多字节字符编码,则应将
wchar\u t
替换为
char
。您还应该使用多字节版本的
\u wcsicmp
\u stricmp
谢谢。让我试一下,然后我会把它标记为解决。太棒了:duseunicode。这就是你的操作系统内部使用的东西。如果它破坏了你的项目,修复它一次,然后继续前进。使用ANSI版本的Windows API会带来大量问题。有些字符串不能用单个代码页来表示,我甚至不确定,如果模块名是这些字符串之一,这个特定的API会返回什么。此外,每当调用API或返回字符串数据时,它都会导致不必要的转换。转换还对字符串长度设置了任意限制,这些限制通常甚至没有文档记录。停止使用ANSI。将
PROCESSENTRY32W
(宽字符)替换为
PROCESSENTRY32
(多字节),然后它就会工作。我按照您所说的那样替换了它,但现在我得到了:'int\u wcsicmp(const wchar\u t*,const wchar\u t*):无法将参数2从'CHAR[260]转换为'const wchar\u t*'和:'CHAR*类型的参数与类型为“const wchar\u t*”的参数不兼容。如果项目配置为使用多字节字符编码,则应将
wchar\u t
替换为
char
。您还应该使用多字节版本的
\u wcsicmp
\u stricmp
谢谢。让我试一下,然后我会把它标记为解决。太棒了:duseunicode。这就是你的操作系统内部使用的东西。如果它破坏了你的项目,修复它一次,然后继续前进。使用ANSI版本的Windows API会带来大量问题。有些字符串不能用单个代码页来表示,我甚至不确定,如果模块名是这些字符串之一,这个特定的API会返回什么。此外,每当调用API或返回字符串数据时,它都会导致不必要的转换。转换还对字符串长度设置了任意限制,这些限制通常甚至没有文档记录。停止使用ANSI.const char\u t*会出现错误。使用just char不会出错,但我必须检查它是否真的有效谢谢你的帮助,它解决了我的多字节错误,并给了我一个新的。我不确定这是否也是一个多字节错误,但我会将其标记为解决。你认为你能帮我解决其他函数中的这个错误吗?我认为这也是一个Unicode错误,但我不确定如何处理这个错误:错误状态:无法将const char转换为std::basic_stringReplace
std::wstring
std::string
谢谢!!!。没有错误,它构建得很好,但我的代码不工作,所以我猜它一定是其他ECONST char\u t*给出的错误。使用just char不会出错,但我必须检查它是否真的有效谢谢你的帮助,它解决了我的多字节错误,并给了我一个新的。我不确定这是否也是一个多字节错误,但我会将其标记为解决。你认为你能帮我解决其他函数中的这个错误吗?我认为这也是一个Unicode错误,但我不确定如何处理这个错误:错误状态:无法将const char转换为std::basic_stringReplace
std::wstring
std::string
谢谢!!!。没有错误,它构建得很好,但我的代码不工作,所以我猜它一定是其他东西