Этот код будет считывать текущий процесс из ОС и отображать его (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 );
}
Нет вашей проблемы не с прототипом - прототипы в windows.h в порядке. Если вы заметили, что сообщение об ошибке начинается с LNK
это означает, что компоновщик дает ошибку. Это означает, что компоновщик не может найти эти функции.
Если вы посмотрите на документацию для одной из функций, которая дает ошибку, EnumProcessModules в самом низу в разделе " Library
" вы увидите, что в Windows XP требуется привязка к Psapi.lib
. Visual C++ не ссылается на эту библиотеку по умолчанию, как и на Kernel32.lib
, поэтому любые функции, определенные в этой библиотеке, прекрасны.
Вы можете добавить Psapi.lib
в раздел Additional Libraries
вашего проекта или просто добавить строку:
#pragma comment(lib, "Psapi.lib")
В начало файла, который даст указание компоновщику использовать Psapi.lib.