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

时间:2014-12-06 20:03:51

标签: c++ delphi

我在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);
}

1 个答案:

答案 0 :(得分:5)

  • 在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)是很大的错误。您告诉编译器这些变量与其真实类型的类型不同。从本质上讲,你对编译器撒谎。这并不能很好地结束。你需要处理真正的问题。解决这个问题的正确方法是使用本机字符集,即为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")

我希望还有更多我尚未发现的问题。遗憾!

我的最后建议是将编译器警告发挥到最大程度,并注意它们。