[英]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.