c++ - 从OS读取正在运行的进程并通过C++显示!

标签 c++ process operating-system

此代码将从 OS 读取正在运行的进程并显示它 (C++)。具体来说,这里的操作系统是Windows XP。问题(错误)在(我认为)原型(prototype)中。顺便说一句,它显示以下错误。

错误 1:错误 LNK2019:函数 _main 中引用了未解析的外部符号 _EnumProcesses@12

错误 2:错误 LNK2019:函数“void __cdecl DisplayProcessNameAndID(unsigned long)”(?DisplayProcessNameAndID@@YAXK@Z) 中引用的未解析外部符号 _GetModuleBaseNameA@16

错误 3:错误 LNK2019:函数“void __cdecl DisplayProcessNameAndID(unsigned long)”(?DisplayProcessNameAndID@@YAXK@Z) 中引用的未解析外部符号 _EnumProcessModules@16

错误 4: fatal error LNK1120:3 个 Unresolved external C:\Documents and Settings\Windows\My Documents\Visual Studio 2008\Projects\a\Debug\a.exe

#include <afxwin.h>

#include <iostream>
#include <string.h>

#include "psapi.h"
unsigned int i;

using namespace std;
void DisplayProcessNameAndID(DWORD processID);
void main()
{

   DWORD aProcesses[1024], cbNeeded, cProcesses;
   if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
      return;
   cProcesses = cbNeeded / sizeof(DWORD);


   for ( i = 0; i < cProcesses; i++ )
   {
   if( aProcesses[i] != 0 )
          DisplayProcessNameAndID( aProcesses[i] );
   }
};
void DisplayProcessNameAndID( 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) );
      }
   };
   CString str;
   str.Format("Text:%s, PID : %u", szProcessName, processID );
   AfxMessageBox(str);
   CloseHandle( hProcess );
   }

最佳答案

不,您的问题不在于原型(prototype) - windows.h 中的原型(prototype)很好。如果您注意到错误消息以 LNK 开头,这意味着 linker给出了错误。这意味着链接器无法找到这些函数。

如果您查看出现错误的函数之一的文档,EnumProcessModulesLibrary 部分的最底部,您会看到在 Windows XP 上它需要链接到 Psapi.lib。默认情况下,Visual C++ 不会链接到该库,就像它为 Kernel32.lib 所做的那样,这就是为什么在该库中定义的任何函数都可以正常工作的原因。

您可以将 Psapi.lib 添加到项目的 Additional Libraries 部分,或者只添加以下行:

#pragma comment(lib, "Psapi.lib")

到文件的顶部,它将指示链接器使用 Psapi.lib。

关于c++ - 从OS读取正在运行的进程并通过C++显示!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20720748/

相关文章:

c# - window CE。如何按名称杀死进程?

linux - Linux 中 PID_MAX 取决于什么因素

c - 为什么 virt_to_page(addr) 不起作用?

c++ - 子对象初始化的顺序是什么?

c++ - 在 C++ 中,重载运算符后,运算符是否会失去其旧功能?

c++ - pthreads 程序工作了一段时间然后停止

linux - 我们如何添加应用程序远程启动(Linux)

c++ - Clang 在模板上下文中找不到函数定义后实例化的函数

java - 在 Java 中继续之前等待进程完成

bash - Shell 脚本读取缺少最后一行