【问题标题】:Reading the running process from OS and displaying it through C++!从 OS 读取正在运行的进程并通过 C++ 显示!
【发布时间】:2013-12-21 15:53:10
【问题描述】:

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

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

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

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

错误 4:致命错误 LNK1120:3 个未解析的外部 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 );
   }

【问题讨论】:

  • 你的 windows.h 是 C 吗?如果是这样,您可能需要一个外部“C”来防止 C++ 名称修改搞砸您的链接器。
  • 我不必对 windows.h 做任何事情。因此我删除了它。没什么区别。
  • 任何帮助将不胜感激。
  • 您必须将“psapi.lib”添加到链接器的附加依赖项设置中。

标签: c++ process operating-system


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 那有什么问题?
  • @Jamel - 我在完成之前不小心点击了保存。给我一点时间来完成我的回答。
猜你喜欢
  • 2011-12-10
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 2020-05-13
  • 2011-06-03
  • 1970-01-01
相关资源
最近更新 更多