我正在使用Windows函数CreateToolhelp32snapshot
枚举计算机上正在运行的进程。它返回的pe32.szeFileName
字段是WCHAR
,这是可执行文件的名称。
我想将每个可执行文件的名称与我生成的一堆可执行文件进行比较,如下所示:
WCHAR* processNames[numProcesses] = { "word", "excel", "outlook, ...}
不幸的是,我不知道如何检查此processNames数组的任何元素是否是从
WCHAR
返回的pe32.szeFilename
的子字符串。我知道如果我处理两个
wcsstr
字符串,const wchar_t *
会起作用。如何将WCHAR
返回的pe32.szeFilename
与字符串数组的每个元素进行比较?具体来说,我想看看数组中的任何字符串(任何格式的格式都可以)是否是WCHAR
的子字符串。编辑:我当前的循环:
do {
wprintf(L"Process name: %s\n", pe32.szExeFile);
for (int i = 0; i < numProcesses; ++i) {
if (wcsstr(pe32.szExeFile, processNames[i])) {
// Found it
wprintf("%s", pe32.szExeFile);
}
}
} while (Process32Next(hProcessSnap, &pe32));
最佳答案
用unicode
标记的问题,所以我想,您应该尝试将所有文字的声明更改为L"characters"
,例如:
WCHAR* processNames[numProcesses] = { L"word", L"excel", L"outlook", ...}
然后检查是否使用了适当的unicode函数,例如定义了
UNICODE
或使用了W
的函数名称:Process32FirstW(hProcessSnap, &pe32);
. . .
Process32NextW(hProcessSnap, &pe32);
最后(从那开始,也许这可以让您查看
if
条件的结果),对L"%s"
使用wprintf
:wprintf(L"%s", pe32.szExeFile);
更新:
为了检查
wprintf
的行为,我写了一小段代码(使用了Visual Studio 2013),因此#include <tchar.h>
#include <windows.h>
int main(void)
{
WCHAR* procName = L"excel";
WCHAR* processNames[3] = { L"word", L"excel", L"outlook" };
wprintf(L"Process name: %s\n", procName);
for (int i = 0; i < 3; ++i) {
if (wcsstr(procName, processNames[i])) {
wprintf("%s", procName);
}
}
return 0;
}
是
流程名称:excel
(即
if
的状态为假),但是代码(在循环内为
L
仅添加了一个wprintf
)#include <tchar.h>
#include <windows.h>
int main(void)
{
WCHAR* procName = L"excel";
WCHAR* processNames[3] = { L"word", L"excel", L"outlook" };
wprintf(L"Process name: %s\n", procName);
for (int i = 0; i < 3; ++i) {
if (wcsstr(procName, processNames[i])) {
wprintf(L"%s", procName);
}
}
return 0;
}
表演
流程名称:excel
擅长
关于c - 查看WCHAR *是否为C中WCHAR的子字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44234435/