【问题标题】:How to fill a listBox with the all running applications如何用所有正在运行的应用程序填充列表框
【发布时间】:2015-10-01 09:10:17
【问题描述】:

我试图用所有正在运行的应用程序的列表填充列表框(我正在使用 C++ Builder)并且通过搜索我发现这段代码只给我正在运行的应用程序的列表,它会打印一些不需要的文本和运行应用程序

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>

void PrintProcessNameAndID( DWORD processID )
{
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");



HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                               PROCESS_VM_READ,
                               FALSE, processID );



if (NULL != hProcess )
{
    HMODULE hMod;
    DWORD cbNeeded;

    if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
         &cbNeeded) )
    {
        GetModuleBaseName( hProcess, hMod, szProcessName, 
                           sizeof(szProcessName)/sizeof(TCHAR) );
    }
}



_tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, processID );



CloseHandle( hProcess );
}

int main( void )
{


DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;

if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
{
    return 1;
}



cProcesses = cbNeeded / sizeof(DWORD);

for ( i = 0; i < cProcesses; i++ )
{
    if( aProcesses[i] != 0 )
    {
        PrintProcessNameAndID( aProcesses[i] );
    }
}

    return 0;
}

我知道这段代码是用于控制台应用程序的,但如果它有效,我会编辑它以在 c++ builder 上运行,但它只是不能。 那么什么是正确的代码呢?

【问题讨论】:

  • 您的for ( i = 0; i &lt; cProcesses; i++ ) 循环基于所需的进程数,而不是阵列中的实际进程数。如果所需的数字大于数组,那么您将超出数组并在垃圾进程 ID 上进行操作。
  • @RaymondChen 其实这不是我的代码,我在 MSDN 上找到的
  • @Kordy 从互联网上粘贴代码而不检查并理解它是愚蠢的。
  • 好的,现在我从文档中看到 cbNeeded 的名称不正确。应该是cbReturned。这部分代码是正确的,但具有误导性。

标签: c++ winapi c++builder


【解决方案1】:

该代码应该适用于所有进程,而不仅仅是控制台进程。可能有多个模块,所以从技术上讲应该是(我网站上的旧 ANSI 代码):

HANDLE hProc;
char szProcessName [80];
HMODULE ahMod [10];
DWORD dwNeeded;

hProc = OpenProcess (PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,
                     FALSE,
                     dwPid);
if (hProc)
{
   if (EnumProcessModules (hProc, 
                           ahMod,
                           sizeof(ahMod),
                           &dwNeeded))
   {
      if (GetModuleBaseName (hProc, 
                             ahMod[0],
                             szProcessName,
                             sizeof(szProcessName)))
      {
         <success>
      }
      else
      {
         <failure>
      } 
   }
   CloseHandle (hProc);
}

正如 raymond 指出的那样,您的循环基于数组的大小(这将导致垃圾)。这可能是由于 MS 对 EnumProcesses 的帮助,它谈到了将数组大小除以 DWORD 的大小,但这只是为了检测函数是否已填满您的数组并且您需要重新提交更多空间。我想您应该在调用 EnumProcesses 之前将您的进程数组清零,即使用 memset(或 ZeroMemory,如果 C++ 构建器支持该宏)。

【讨论】:

  • 我编译了你的代码并得到了this error,即使在包含psapi.h之后也有什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 2011-11-15
相关资源
最近更新 更多