为什么 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()
是 strcmp
或 wcscmp
,并且 _T("...")
宏在 Unicode 模式下在字符串前面放置一个 L
,否则不行。
这当然需要做一些工作,但很快就会变得更加自然,并且您的代码可以针对任何一种方式正确构建。
编辑:我已经考虑了下面的评论,他们可能只是直接针对 Unicode 并跳过 tchar
内容是正确的。我一直在这样做,而且我仍然 有无法在 Win32 上针对 Unicode 的项目(主要是由于旧库和其他技术限制)。
但要完全了解 <tchar.h>
的所有内容是一项相当繁重的工作,而且 - 特别是如果你是一个初学者 - 会浪费时间并且会造成混乱。
所以:直接转到 Unicode 并完成它。这意味着 wcscmp()
和 L
前缀将解决您面前的问题。
我试图在 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()
是 strcmp
或 wcscmp
,并且 _T("...")
宏在 Unicode 模式下在字符串前面放置一个 L
,否则不行。
这当然需要做一些工作,但很快就会变得更加自然,并且您的代码可以针对任何一种方式正确构建。
编辑:我已经考虑了下面的评论,他们可能只是直接针对 Unicode 并跳过 tchar
内容是正确的。我一直在这样做,而且我仍然 有无法在 Win32 上针对 Unicode 的项目(主要是由于旧库和其他技术限制)。
但要完全了解 <tchar.h>
的所有内容是一项相当繁重的工作,而且 - 特别是如果你是一个初学者 - 会浪费时间并且会造成混乱。
所以:直接转到 Unicode 并完成它。这意味着 wcscmp()
和 L
前缀将解决您面前的问题。