gpt4 book ai didi

c++ - Delphi 到 C++(字符串比较,if 语句)

转载 作者:行者123 更新时间:2023-11-30 01:16:05 27 4
gpt4 key购买 nike

我在 delphi 中有程序,我想用 C++ 编写但我在字符串比较和 C++ 中的 if 语句中失败

实际上这是我第一次使用c++,我完全是新手

我的问题是,为什么 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);
}

最佳答案

  • 在 Delphi 中,= 运算符是等于比较运算符。
  • 在 C++ 中,= 运算符是赋值运算符。

因此,在您的 C++ 代码中,当您打算使用 == 时,在某些地方使用 =

特别是你写的地方

if (exists = true)

这执行了 trueexists 的赋值,然后测试该赋值的结果是否为真。好吧,已知该表达式在编译时求值为 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) 是大错误。您是在告诉编译器这些变量的类型与其真实类型不同。本质上你是在欺骗编译器。那不会很好地结束。你需要处理真正的问题。解决这个问题的正确方法是使用 native 字符集,即针对 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 block 结束时立即离开作用域。当您稍后引用 sDummy 时,它就是另一个 sDummy。所以

ProcessName.find(LPSTR(sDummy))

相同
ProcessName.find("System Process")

而且我预计还有更多我尚未发现的问题。对不起!

我最后的建议是将编译器警告打开到最大级别并注意它们。

关于c++ - Delphi 到 C++(字符串比较,if 语句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27335901/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com