Чтение запущенного процесса из ОС и отображение его через C ++!

0

Этот код будет считывать текущий процесс из ОС и отображать его (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\Мои документы \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 );
   }
  • 0
    Ваш windows.h это C? Если это так, вам может понадобиться внешний символ «C», чтобы предотвратить искажение имени компоновщиком в C ++.
  • 0
    Я ничего не должен делать с windows.h. Следовательно я удалил это. Это не имеет значения.
Показать ещё 2 комментария
Теги:
process
operating-system

1 ответ

2
Лучший ответ

Нет вашей проблемы не с прототипом - прототипы в windows.h в порядке. Если вы заметили, что сообщение об ошибке начинается с LNK это означает, что компоновщик дает ошибку. Это означает, что компоновщик не может найти эти функции.

Если вы посмотрите на документацию для одной из функций, которая дает ошибку, EnumProcessModules в самом низу в разделе " Library " вы увидите, что в Windows XP требуется привязка к Psapi.lib. Visual C++ не ссылается на эту библиотеку по умолчанию, как и на Kernel32.lib, поэтому любые функции, определенные в этой библиотеке, прекрасны.

Вы можете добавить Psapi.lib в раздел Additional Libraries вашего проекта или просто добавить строку:

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

В начало файла, который даст указание компоновщику использовать Psapi.lib.

  • 0
    Тогда в чем проблема?
  • 0
    Я не могу понять ошибку.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню