首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用unicode时正确使用WideCharToMultiByte的方法

使用unicode时正确使用WideCharToMultiByte的方法
EN

Stack Overflow用户
提问于 2021-12-09 00:06:16
回答 1查看 198关注 0票数 1

我最近问了一个关于使用unicode的问题,以及这里出现的问题:

argument of type "WCHAR *" is incompatible with parameter of type "LPCSTR" in c++

在解决一个问题的过程中,我遇到了另一个问题,它给我带来了ansi和unicode之间的差异。我学到了很多东西,但经过近一周的努力,我似乎仍然无法解决这个问题。

我查看了How do you properly use WideCharToMultiByte,因为我认为这是我需要将find_pid从unicode转换回char的东西,否则我会出错,但没有效果。

所有的帮助,无论是小的还是小的,都受到赞赏,因为这使我发疯。

以下是我想要解决的问题:

代码语言:javascript
运行
复制
 DWORD find_pid(const wchar_t* procname) {
// Dynamically resolve some functions
HMODULE kernel32 = GetModuleHandleA("Kernel32.dll");

using CreateToolhelp32SnapshotPrototype = HANDLE(WINAPI *)(DWORD, DWORD);
CreateToolhelp32SnapshotPrototype CreateToolhelp32Snapshot = (CreateToolhelp32SnapshotPrototype)GetProcAddress(kernel32, "CreateToolhelp32Snapshot");

using Process32FirstPrototype = BOOL(WINAPI *)(HANDLE, LPPROCESSENTRY32);
Process32FirstPrototype Process32First = (Process32FirstPrototype)GetProcAddress(kernel32, "Process32First");

using Process32NextPrototype = BOOL(WINAPI *)(HANDLE, LPPROCESSENTRY32);
Process32NextPrototype Process32Next = (Process32NextPrototype)GetProcAddress(kernel32, "Process32Next");

// Init some important local variables
HANDLE hProcSnap;
PROCESSENTRY32 pe32;
DWORD pid = 0;
pe32.dwSize = sizeof(PROCESSENTRY32);

// Find the PID now by enumerating a snapshot of all the running processes
hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hProcSnap)
    return 0;

if (!Process32First(hProcSnap, &pe32)) {
    CloseHandle(hProcSnap);
    return 0;
}

while (Process32Next(hProcSnap, &pe32)) {
    if (lstrcmp(procname, pe32.szExeFile) == 0) {
        pid = pe32.th32ProcessID;
        break;
    }
}

// Cleanup
CloseHandle(hProcSnap);

return pid;
  }

//changing to std::wstring does not work, already tried
std::string parentProcess = "C:\\hello.exe"
DWORD pid = find_pid(parentProcess.c_str());
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-09 00:45:56

最有可能的问题是,您正在用UNICODE定义进行编译。在这种情况下,PROCESSENTRY32实际上是PROCESSENTRY32W

但是您调用的是Process32First的ASCII版本,而不是unicode版本的Process32FirstW

大多数同时接受ascii和unicode参数的winapi函数有两个不同的版本:

W

  • A宏(在ascii版本和unicode版本之间切换)(取决于是否定义了A UNICODE )。

就你而言,这将是:

代码语言:javascript
运行
复制
#ifdef UNICODE
#define Process32First Process32FirstW
#define Process32Next Process32NextW
#define PROCESSENTRY32 PROCESSENTRY32W
#define PPROCESSENTRY32 PPROCESSENTRY32W
#define LPPROCESSENTRY32 LPPROCESSENTRY32W
#endif  // !UNICODE

还请记住,Process32First也将填充您的PROCESSENTRY32 (使用第一个找到的条目)。因此,对于当前的实现,您将始终跳过第一个过程。

如果您正在构建一个windows应用程序,最好从一开始就决定是使用ascii、还是 unicode。

(还可以选择使用TCHAR和朋友进行两种编译)

将它们混合在一个应用程序中会导致大量的转换问题(因为不是每个unicode字符都可以在ascii代码页中表示)。

此外,如果您只依赖链接器来导入函数而不是使用GetProcAddress(),这将使您的生活更加轻松。

如果您想坚持使用unicode (新项目的默认设置),可以这样编写函数:

代码语言:javascript
运行
复制
#include <windows.h>
#include <tlhelp32.h>

DWORD find_pid(const wchar_t* procname) {
    // Init some important local variables
    HANDLE hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32);

    // Find the PID now by enumerating a snapshot of all the running processes
    if (hProcSnap == INVALID_HANDLE_VALUE)
        return 0;

    if (!Process32First(hProcSnap, &pe32)) {
        CloseHandle(hProcSnap);
        return 0;
    }

    do {
        if (lstrcmp(procname, pe32.szExeFile) == 0) {
            CloseHandle(hProcSnap);
            return pe32.th32ProcessID;
        }
    } while (Process32Next(hProcSnap, &pe32));

    // not found
    CloseHandle(hProcSnap);
    return 0;
}

就这样叫它:

代码语言:javascript
运行
复制
std::wstring parentProcess = L"C:\\hello.exe";
DWORD pid = find_pid(parentProcess.c_str());

// or just:
DWORD pid = find_pid(L"C:\\hello.exe");

如果您希望您的应用程序能够同时编译unicode & ascii,则必须使用TCHAR

代码语言:javascript
运行
复制
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>

DWORD find_pid(const TCHAR* procname) {
    // Init some important local variables
    HANDLE hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32);

    // Find the PID now by enumerating a snapshot of all the running processes
    if (hProcSnap == INVALID_HANDLE_VALUE)
        return 0;

    if (!Process32First(hProcSnap, &pe32)) {
        CloseHandle(hProcSnap);
        return 0;
    }

    do {
        if (lstrcmp(procname, pe32.szExeFile) == 0) {
            CloseHandle(hProcSnap);
            return pe32.th32ProcessID;
        }
    } while (Process32Next(hProcSnap, &pe32));

    // not found
    CloseHandle(hProcSnap);
    return 0;
}

就这样叫它:

代码语言:javascript
运行
复制
DWORD pid = find_pid(_T("C:\\hello.exe"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70283216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档