我最近问了一个关于使用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的东西,否则我会出错,但没有效果。
所有的帮助,无论是小的还是小的,都受到赞赏,因为这使我发疯。
以下是我想要解决的问题:
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());
发布于 2021-12-09 00:45:56
最有可能的问题是,您正在用UNICODE
定义进行编译。在这种情况下,PROCESSENTRY32
实际上是PROCESSENTRY32W
。
但是您调用的是Process32First
的ASCII版本,而不是unicode版本的Process32FirstW
。
大多数同时接受ascii和unicode参数的winapi函数有两个不同的版本:
W
A
UNICODE
)。就你而言,这将是:
#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 (新项目的默认设置),可以这样编写函数:
#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;
}
就这样叫它:
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
#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;
}
就这样叫它:
DWORD pid = find_pid(_T("C:\\hello.exe"));
https://stackoverflow.com/questions/70283216
复制相似问题