【发布时间】:2023-03-14 07:30:01
【问题描述】:
我正在循环浏览 TlHelp32 的进程快照,然后将名称与 stricmp 进行比较以获取进程句柄。问题是即使两个值似乎相同,但它们显然不是,因为它不返回 0 。我不知道为什么,我也尝试将进程名称写入函数。
HANDLE GetProcessValues(std::string ProcName)
{
const char* ProcNameChar = ProcName.c_str();
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
if (Process32First(snapshot, &process))
{
do
{
if (_stricmp((char*)process.szExeFile,ProcNameChar)==0)
{
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process.th32ProcessID);
return hProc;
}
}while (Process32Next(snapshot,&process));
}
return 0;
}
【问题讨论】:
-
你为什么在
_stricmp的第一个参数中转换为char *?如果是因为类型不匹配错误而关闭编译器,请停止这样做并为函数提供正确的字符串类型。永远不要转换字符串类型——转换是不是转换。 -
你欺骗了编译器,得到了你应得的甜点
-
让您的应用程序使用 Unicode,而不是 hack。并使用
std::wstring代替std::string、wchar_t代替char等。 -
你需要明白你必须停止对编译器撒谎的事实。这是第 1 步。
-
问题是你有一个大杂烩的字符串类型,你没有一个连贯的设计来确定你的应用程序使用的实际字符串类型。这里是字符,那里是 wchar,这里是 Unicode 函数调用,那里是 ANSI 函数调用,等等。专注于使用一种且仅一种字符串类型,并调用处理这些字符串类型的正确函数。最好坚持使用 Unicode,因为目前在 Windows 时代创建的 MBCS 应用程序非常少。
标签: c++ winapi comparison data-conversion