我在delphi中有程序我想用C ++编写它 但我在字符串比较和c ++中的if语句中失败了
实际上这是我第一次使用c ++ i完全基本的和新的
我的问题是为什么C ++中的消息框显示每个进程名称,即使是字符串比较和if语句?
if(DuplicateHandle(hProcess, (HANDLE)pHandleInfo->Handles[dwIdx].Handle,
GetCurrentProcess(), &hObject, STANDARD_RIGHTS_REQUIRED, FALSE, 0) != FALSE)
{
LPWSTR lpwsName = GetObjectInfo(hObject, ObjectNameInformation);
if(lpwsName != NULL)
{
LPWSTR lpwsType = GetObjectInfo(hObject, ObjectTypeInformation);
LPSTR lpszProcess = new CHAR[MAX_PATH];
ZeroMemory(lpszProcess, MAX_PATH);
LPSTR sDummy = "System Process";
if (GetModuleFileNameEx(hProcess, NULL, lpszProcess, MAX_PATH))
LPSTR sDummy = PathFindFileName(lpszProcess);
std::string ProcessName = "Test.exe"; //fail
bool exists = ProcessName.find(LPSTR(sDummy)) != std::string::npos; //fail
if (exists = true) { //fail
std::string HType = "M"; //fail
bool exists = HType.find(LPSTR(lpwsType)) != std::string::npos; //fail
if (exists = true) { //fail
MessageBox(0, "PID:", "PID", 0);
}
}
}
CloseHandle(hObject);
}
答案 0 :(得分:5)
=
运算符是等于比较运算符。=
运算符是赋值运算符。因此,当您打算使用=
时,您的C ++代码会在某些地方使用==
。
特别是你写的地方
if (exists = true)
执行true
到exists
的分配,然后测试该分配的真实结果。好吧,已知表达式在编译时评估为true
,并且当您不打算时,最终会修改exists
。你的意思是写:
if (exists == true)
顺便说一句,你不应该写
if (b == true)
或
if (b == false)
写
是惯用的if (b)
或
if (!b)
所以我会像这样重写代码的错误部分:
if (ProcessName.find(LPSTR(sDummy)) != std::string::npos)
{
std::string HType = "M";
if (HType.find(LPSTR(lpwsType)) != std::string::npos)
{
MessageBox(0, "PID:", "PID", 0);
}
}
您的代码中还有其他问题,我说这些问题超出了本问题的范围。例如,LPSTR(sDummy)
和LPSTR(lpwsType)
是很大的错误。您告诉编译器这些变量与其真实类型的类型不同。从本质上讲,你对编译器撒谎。这并不能很好地结束。你需要处理真正的问题。解决这个问题的正确方法是使用本机字符集,即为Unicode编译。
if (DuplicateHandle(...) != FALSE)
应该是
if (!DuplicateHandle(...))
执行此操作时也会泄漏:
LPSTR lpszProcess = new CHAR[MAX_PATH];
你永远不会删除那个记忆。但是在堆上分配固定长度的字符串是没有意义的。在堆栈上分配它。
ZeroMemory(lpszProcess, MAX_PATH);
初始化由您要调用的函数写入的内存没有意义。别这么做。
我在这里修改了你的缩进:
if (GetModuleFileNameEx(hProcess, NULL, lpszProcess, MAX_PATH))
LPSTR sDummy = PathFindFileName(lpszProcess);
但这看起来仍然不对劲。您在此处创建一个新变量名sDummy
,在if
块结束时立即离开范围。当您稍后引用sDummy
时,它是另一个sDummy
。所以
ProcessName.find(LPSTR(sDummy))
与
相同ProcessName.find("System Process")
我希望还有更多我尚未发现的问题。遗憾!
我的最后建议是将编译器警告发挥到最大程度,并注意它们。