为什么 strcmp 不能与 Process32NextW 一起使用?

Why does strcmp not working with Process32NextW?

我试图在 Process32NextW 调用后在 szExeFile 中找到 "python.exe"。

我试过

if(strcmp(lppe->szExeFile,"python.exe") == 0){
    //do stuff
}

但尽管过程 运行,检查总是失败。 我也尝试过使用 strncmp 但它没有改变任何东西。

我做错了什么?

Process32NextW() 似乎使用具有宽字符串的 PROCESSENTRY32W 结构。尝试 wcscmp() 而不是 strcmp().

所有 W 版本的 Win32 调用都使用 Unicode,即宽字符。并且您必须匹配它们:A=char 和 W=wchar_t 宽,并且您必须使所有各种调用匹配。

解决这个问题的窄路是:

if (wcscmp(lppe->szExeFile, L"python.exe") == 0){
    //do stuff
}

其中wcscmp使用宽字符,字符串前面的L使得wchar_t的字符串代替了char.

但是使用 tchar 层构建代码以在 Unicode 中工作要好得多,这样可以更轻松地使用 ASCII 或 Unicode 构建代码,而且麻烦最少。

可以在项目文件中设置 UNICODE(和 _UNICODE)宏来告诉编译器您想要完整的 16 位支持,并且使用一些代码就可以了:

#include <tchar.h>

{
    ...
    while (ProcessNext32(...))
    {
        if (_tcscmp(lppe->szExeFile, _T("python.exe")) == 0)
        {
             // do stuff

注意 ProcessNext32 没有提到 A 或 W;这会自动调整为 Unicode 或不。

同样,_tcscmp()strcmpwcscmp,并且 _T("...") 宏在 Unicode 模式下在字符串前面放置一个 L,否则不行。

这当然需要做一些工作,但很快就会变得更加自然,并且您的代码可以针对任何一种方式正确构建。

编辑:我已经考虑了下面的评论,他们可能只是直接针对 Unicode 并跳过 tchar 内容是正确的。我一直在这样做,而且我仍然 有无法在 Win32 上针对 Unicode 的项目(主要是由于旧库和其他技术限制)。

但要完全了解 <tchar.h> 的所有内容是一项相当繁重的工作,而且 - 特别是如果你是一个初学者 - 会浪费时间并且会造成混乱。

所以:直接转到 Unicode 并完成它。这意味着 wcscmp()L 前缀将解决您面前的问题。