c++ - 来自发布的调试差异的结果

标签 c++ winapi visual-c++ process

我这里有这段代码:

#include "windows.h"
#include "Tlhelp32.h"
#include "shellapi.h"
#include <wchar.h>
#include <fstream>

bool enumProcesses();

int main()
{
    enumProcesses();
    ShellExecute( NULL, L"open", L"log.txt", NULL, NULL, SW_SHOW );

    return 0;
}



bool enumProcesses()
{
    std::wofstream log("log.txt");
    PROCESSENTRY32 lppe;
    MODULEENTRY32 lpme;
    HANDLE hSnapshot;
    HANDLE mSnapshot;

    lppe.dwSize = sizeof( PROCESSENTRY32 );
    lpme.dwSize = sizeof( MODULEENTRY32 );
    hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

    if( hSnapshot == INVALID_HANDLE_VALUE )
    {
        log << L"Error creating process snapshot.";
        return false;
    }

    if( !Process32First( hSnapshot, &lppe ) )
    {
        log << L"Error enumerating first process.";
        return false;
    }
    else 
    {
        mSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, lppe.th32ProcessID );

        if( mSnapshot != INVALID_HANDLE_VALUE )
        {
            Module32First( mSnapshot, &lpme );
        }

        if( wcscmp( lppe.szExeFile, L"[System Process]" ) != 0 )
        {
            log << lpme.szExePath << "\n";
        }       
    }

    while( Process32Next( hSnapshot, &lppe ) )
    {
        if( wcscmp( lppe.szExeFile, L"System" ) != 0 ) 
        {
            if( (mSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, lppe.th32ProcessID )) != INVALID_HANDLE_VALUE )
            {
                if( Module32First( mSnapshot, &lpme ) ) {
                    log << lpme.szExePath << "\n";
                }

            }
        }
    }

    CloseHandle( hSnapshot );
    CloseHandle( mSnapshot );
    log.close();

    return true;
}

我的问题是,每当我在 VC++ 中使用 F5 或 CTRL + F5 调试此代码时,它都会向我显示所有进程,但是当我创建发布版本并运行它时,有些东西甚至不再显示,我不知道为什么..

我说的是:

发布版本:

C:\WINDOWS\Explorer.EXE
C:\Program Files\Java\jre6\bin\jusched.exe
C:\WINDOWS\system32\ctfmon.exe
C:\Program Files\Messenger\msmsgs.exe
C:\WINDOWS\system32\wscntfy.exe
C:\WINDOWS\system32\wuauclt.exe
c:\Program Files\Microsoft Visual Studio 9.0\Common7\ide\mspdbsrv.exe
C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe
C:\Program Files\Mozilla Firefox\firefox.exe
C:\Documents and Settings\windows\Desktop\c++ projects\gggg\Debug\gggg.exe

调试时创建的日志:

\SystemRoot\System32\smss.exe
\??\C:\WINDOWS\system32\csrss.exe
\??\C:\WINDOWS\system32\winlogon.exe
C:\WINDOWS\system32\services.exe
C:\WINDOWS\system32\lsass.exe
C:\WINDOWS\system32\svchost.exe
C:\WINDOWS\system32\svchost.exe
C:\WINDOWS\System32\svchost.exe
C:\WINDOWS\system32\svchost.exe
C:\WINDOWS\system32\svchost.exe
C:\WINDOWS\system32\spoolsv.exe
C:\WINDOWS\Explorer.EXE
C:\Program Files\Java\jre6\bin\jusched.exe
C:\WINDOWS\system32\ctfmon.exe
C:\Program Files\Messenger\msmsgs.exe
C:\Program Files\Java\jre6\bin\jqs.exe
c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe
c:\Program Files\Microsoft SQL Server\90\Shared\sqlwriter.exe
C:\WINDOWS\System32\alg.exe
C:\WINDOWS\system32\wscntfy.exe
C:\WINDOWS\system32\wuauclt.exe
c:\Program Files\Microsoft Visual Studio 9.0\Common7\ide\mspdbsrv.exe
C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe
C:\Program Files\Mozilla Firefox\firefox.exe
C:\WINDOWS\system32\NOTEPAD.EXE
C:\WINDOWS\system32\cmd.exe
c:\Documents and Settings\windows\Desktop\c++ projects\gggg\Release\gggg.exe

和权限有关系吗?

编辑:

查看 1800 INFORMATION 的帖子,我试图通过使用 psexec -i -d -s 来“强制”它在 SYSTEM 帐户下运行并且它起作用了......有什么方法可以在不需要这样做的情况下运行它一个东西?

最佳答案

我敢打赌,当您调试它时,您是在具有管理员权限的 Visual Studio 中运行它,而当您运行发布版本时,它不会,因此它无法看到系统中的所有进程。这与任务管理器无法列出所有正在运行的进程的原因相同,除非您提升。

关于c++ - 来自发布的调试差异的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1062154/

相关文章:

c++ - 如何保持循环直到函数返回?

c++ - 如何将 Qt 组合框与按钮和某种显示图片的小部件连接起来?

c++ - 即使 CMenu 当前打开,如何强制 LVN_HOTTRACK 始终触发

delphi - 使用对话框时无法使 DragAcceptFiles 工作

visual-studio-2010 - VC++ 2010 - 向解决方案中的单个项目添加配置无法构建

c++ - 如何使用 std::is_same 生成编译时错误?

c++ - "Large"使用C++ Qt和Qt Xlsx模块读取xlsx文件

c++ - 如何将比较器传递给内部 map ?

c# - 如何在非事件窗口中用代码模拟键盘事件?

c++ - 如何将目录路径作为进程的命令行传递?