![](/img/trans.png)
[英]Error events when CreateProcess uses a path: E0167 argument of type "char *" is incompatible with parameter of type "LPWSTR"
[英]E0167 argument of type "CHAR *" is incompatible with parameter of type "const wchar_t *"
我正在编写一个允许我在流程上画线的项目,但我遇到了 2 个错误:
E0167: argument of type "CHAR *" is incompatible with parameter of type "const wchar_t *"
C2664: 'int _wcsicmp(const wchar_t *,const wchar_t *)': cannot convert argument 1 from 'CHAR [260]' to 'const wchar_t *'
我已将项目设置从 Unicode 更改为多字节。 它解决了这个问题,但是在切换它之后,我在代码的另一部分出现了另一个错误。
这是来源:
DWORD GetProcId(const wchar_t* procName)
{
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))
{
procId = procEntry.th32ProcessID;
break;
}
} while (Process32Next(hSnap, &procEntry));
}
}
}
uintptr_t GetModuleBaseAddress(DWORD dwPid, const char* moduleName) {
uintptr_t dwBase = 0;
do {
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwPid);
if (hSnapshot == INVALID_HANDLE_VALUE) { continue; }
MODULEENTRY32 ModuleEntry32;
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnapshot, &ModuleEntry32)) {
do {
if (!strcmp(ModuleEntry32.szModule, (LPSTR)moduleName)) {
dwBase = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
} while (Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
} while (!dwBase);
return dwBase;
}
当字符集在Unicode上时, if (._wcsicmp(procEntry,szExeFile, procName))
不会给我任何错误。 但是,在GetModuleBase()
中, if ( ModuleEntry32
if (.strcmp(ModuleEntry32,szModule, (LPSTR)moduleName))
中的 ModuleEntry32 给了我上面显示的两个错误。
当我将字符集设置为多字节时,错误切换到procEntry
in line if (._wcsicmp(procEntry,szExeFile, procName))
。
我似乎无法弄清楚这个问题。 它一直告诉我argument of type "CHAR *" is incompatible with parameter of type "const wchar_t*"
首先,您的GetProcId()
有问题。 它正在泄漏快照HANDLE
,实际上并没有return
进程 ID。
话虽如此 -
您将char
/ wchar_t
字符串与TCHAR
API 混合在一起,但它们并不意味着混合。
定义UNICODE
时, TCHAR
映射到wchar_t
, PROCESSENTRY32
映射到PROCESSENTRY32W
, Process32First()
映射到Process32FirstW()
等。
否则,当UNICODE
未定义时, TCHAR
映射到char
, PROCESSENTRY32
映射到PROCESSENTRY32A
, Process32First()
映射到Process32FirstA()
等。
因此,如果要使用基于TCHAR
的 Win32 API 函数,则需要使用TCHAR
字符串和基于TCHAR
的字符串比较(即_tcsicmp()
),例如:
DWORD GetProcId(const TCHAR* procName)
{
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 (!_tcsicmp(procEntry.szExeFile, procName))
{
procId = procEntry.th32ProcessID;
break;
}
} while (Process32Next(hSnap, &procEntry));
}
CloseHandle(hSnap);
}
return procId;
}
uintptr_t GetModuleBaseAddress(DWORD dwPid, const TCHAR* moduleName) {
uintptr_t dwBase = 0;
do {
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwPid);
if (hSnapshot == INVALID_HANDLE_VALUE) { continue; }
MODULEENTRY32 ModuleEntry32;
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnapshot, &ModuleEntry32)) {
do {
if (!_tcsicmp(ModuleEntry32.szModule, moduleName)) {
dwBase = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
} while (Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
} while (!dwBase);
return dwBase;
}
否则,当使用显式char
/ wchar_t
字符串时,您需要直接使用 Unicode/ANSI API,例如:
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;
}
uintptr_t GetModuleBaseAddress(DWORD dwPid, const char* moduleName) {
uintptr_t dwBase = 0;
do {
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwPid);
if (hSnapshot == INVALID_HANDLE_VALUE) { continue; }
MODULEENTRY32A ModuleEntry32;
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32FirstA(hSnapshot, &ModuleEntry32)) {
do {
if (!strcmp(ModuleEntry32.szModule, moduleName)) {
dwBase = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
} while (Module32NextA(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
} while (!dwBase);
return dwBase;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.