2013-12-21 4 views
0

Этот код будет читать текущий процесс из ОС и отображать его (C++). В частности, ОС здесь - Windows XP. Проблема (ошибка) находится в (я думаю) прототипе. Кстати, он отображает следующие ошибки.Чтение текущего процесса из ОС и его отображение через C++!

Ошибка 1: LNK2019 Ошибки: неразрешенный внешний символ _EnumProcesses @ 12, указанный в функции _Главной

Ошибка 2: LNK2019 Ошибки: неразрешенный внешний символ _GetModuleBaseNameA @ 16 ссылки в функции «недействительный __cdecl DisplayProcessNameAndID (без знака длина) "(DisplayProcessNameAndID @@ YAXK @ Z?)

ошибка 3: LNK2019 ошибка: неразрешенный внешний символ _EnumProcessModules @ 16, указанные в функции "недействительным __cdecl DisplayProcessNameAndID (без знака длиной)"(DisplayProcessNameAndID @@ YAXK @ Z?)

Ошибка 4: фатальная ошибка LNK1120: 3 неразрешенные внешние C: \ Documents и Settings \ Windows \ Мои документы \ Visual Studio 2008 \ Projects \ в \ 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

Ваши окна.h есть C? Если это так, вам может понадобиться extern «C», чтобы предотвратить зависание имен C++ от зависания вашего компоновщика. –

+0

Мне ничего не нужно делать с windows.h. Поэтому я удалил его. Это не имеет значения. – Jamil

+0

Любая помощь будет оценена по достоинству. – Jamil

ответ

2

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

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

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

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

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

+0

Тогда какая проблема? – Jamil

+0

Я не могу понять ошибку. – Jamil

+0

@Jamel - Я ударил случайно, прежде чем закончил. Дайте минутку, чтобы закончить мой ответ. – shf301

Смежные вопросы