【发布时间】: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