【问题标题】:How to use unicode and multi byte character sets?如何使用 unicode 和多字节字符集?
【发布时间】:2020-03-28 08:19:33
【问题描述】:

我有一个需要使用 Unicode 字符集和多字节的 C++ 应用程序。有没有办法做到这一点?请注意,我的项目需要多字节,我还需要使用这个 Unicode 函数

我在互联网上搜索了很多东西,没有发现任何好东西。

DWORD GetProcId(const wchar_t *procName) // EXPERIMENTING
{
  DWORD procId = 0;
  HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnap != INVALID_HANDLE_VALUE) {
    PROCESSENTRY32 procEntry;
    procEntry.dwSize = sizeof(procEntry);

    if (Process32First(hSnap, &procEntry)) {
      do {
        if (!_wcsicmp(procEntry.szExeFile, procName)) // Error is here
        {
          procId = procEntry.th32ProcessID;
          break;
        }
      } while (Process32Next(hSnap, &procEntry));
    }
  }
  CloseHandle(hSnap);
  return procId;
}

procEntry.szExeFile 只能在 Unicode 字符集上编译,但我需要应用程序使用多字节

【问题讨论】:

  • 为什么?多字节模式是传统模式,不推荐使用。
  • 密切相关:How To Fix Unicode/MultiByte Compatibility Issues。解决方案是相同的 - 您的函数将 Unicode 字符串作为输入,因此您应该明确使用 API 的 Unicode 版本,而不是您尝试使用的 TCHAR 版本。
  • Win32 API 要么是 Unicode 要么 多字节,而不是两者。 API 宏将根据项目设置自动选择 A 或 W 版本。除非您使用支持 UTF-8 语言环境的较新的 Windows 10 版本,否则切勿使用多字节
  • @phuclv 有时必须使用多字节,以防遗留应用程序需要维护并且转换为 unicode 成本太高

标签: c++ winapi


【解决方案1】:

您的函数将 Unicode 字符串作为输入,因此您应该明确使用 API 的 Unicode 版本,而不是您尝试使用的 TCHAR 版本,例如:

DWORD GetProcId(const wchar_t *procName)
{
    DWORD procId = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32W procEntry;
        procEntry.dwSize = sizeof(procEntry);
        if (Process32FirstW(hSnap, &procEntry))
        {
            do
            {
                if (!_wcsicmp(procEntry.szExeFile, procName))
                {
                    procId = procEntry.th32ProcessID;
                    break;
                }
            }
            while (Process32NextW(hSnap, &procEntry));
        }
        CloseHandle(hSnap);
    }
    return procId;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2017-06-07
    相关资源
    最近更新 更多