查看 WCHAR* 是否是 C 中 WCHAR 的子串

See if WCHAR* is substring of WCHAR in C

我正在使用 Windows 函数 CreateToolhelp32snapshot 枚举我机器上的 运行 个进程。 pe32.szeFileName 字段 returns 是一个 WCHAR,这是可执行文件的名称。

我想将每个可执行文件名称与我生成的一长串可执行文件进行比较,如下所示:

WCHAR* processNames[numProcesses] = { "word", "excel", "outlook, ...}

不幸的是,我不知道如何检查 这个 processNames 数组的任何元素是否是从 pe32.szeFilename 返回的 WCHAR 的子串

我知道如果我处理两个 const wchar_t * 字符串,wcsstr 会起作用。如何将 pe32.szeFilename 返回的 WCHAR 与字符串数组的每个元素进行比较?具体来说,我想看看数组中的任何字符串(任何格式都可以)是 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" for 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;
}

Process name: excel

(即看起来 if 有错误条件),

但是代码(只为 wprintf 内部循环添加了一个 L

#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;
}

显示

Process name: excel

excel