获得进程名函数编译出现问题

dackle 2007-11-16 10:45:50
编译下面的代码
DWORD ProcessToPid(char *InputProcessName)
{
DWORD aProcesses[1024],cbNeeded,cProcesses;
unsigned int i;
HANDLE hProcess;
HMODULE hMod;
LPWSTR werr;
char szProcessName[MAX_PATH]="UnknownProcess";
if(!EnumProcesses(aProcesses,sizeof(aProcesses),&cbNeeded))
return 0;
cProcesses=cbNeeded/sizeof(DWORD);
for(i=0;i<cProcesses;i++)
{
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,aProcesses[i]);
if(hProcess)
{
if(EnumProcessModules(hProcess,&hMod,sizeof(hMod),&cbNeeded))
{
werr=(LPWSTR)szProcessName;
GetModuleBaseName(hProcess,hMod,werr,sizeof(szProcessName));
if(!_stricmp(szProcessName,InputProcessName))
{
CloseHandle(hProcess);
}
}


}
}
CloseHandle(hProcess);
return 0;


}

出现
10 error LNK2019: 无法解析的外部符号 _GetModuleBaseNameW@16,该符号在函数 "unsigned long __cdecl ProcessToPid(char *)" (?ProcessToPid@@YAKPAD@Z) 中被引用 wewe.obj


请高手指点下,实在不知道错在何处。
...全文
108 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsphuang 2007-11-16
  • 打赏
  • 举报
回复
例如:#pragma comment(lib,"Psapi.lib")
这句的意思是将Psapi.lib库加入到工程中进行编译。
注:此命令行不需要加分号(“;”)。
jsphuang 2007-11-16
  • 打赏
  • 举报
回复
例如:#pragma comment(lib,"Psapi.lib")
这句的意思是将Psapi.lib库加入到工程中进行编译。
注:此命令行不需要加分号(“;”)。
jsphuang 2007-11-16
  • 打赏
  • 举报
回复
例如:#pragma comment(lib,"Psapi.lib")
这句的意思是将Psapi.lib库加入到工程中进行编译。
注:此命令行不需要加分号(“;”)。
covsno 2007-11-16
  • 打赏
  • 举报
回复
我操
我比你先发表为什么你的在我前面?
dackle 2007-11-16
  • 打赏
  • 举报
回复
不是很明白,头文件里有psapi.h 这个包含了 呀
covsno 2007-11-16
  • 打赏
  • 举报
回复
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib")
yxz_lp 2007-11-16
  • 打赏
  • 举报
回复
Header Declared in Psapi.h.

Library Use Psapi.lib.

dackle 2007-11-16
  • 打赏
  • 举报
回复
yxz_lp大哥,
错误依旧,是什么原因导致的?
yxz_lp 2007-11-16
  • 打赏
  • 举报
回复
Requires Windows Vista, Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0.
如果符合要求

#ifndef WINVER // 允许使用特定于 Windows XP 或更高版本的功能。
#define WINVER 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif

#ifndef _WIN32_WINNT // 允许使用特定于 Windows XP 或更高版本的功能。
#define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif
dackle 2007-11-16
  • 打赏
  • 举报
回复
covsno,呵呵,我也不知道为什么,不好意思,你在楼上,楼高,注意多加衣服。
dackle 2007-11-16
  • 打赏
  • 举报
回复
谢谢,上面的错误没有了,出现了 这个
错误
CMainindowIterat 我是重载的,代码如下:
class CWindowIterator {
protected:
HWND* m_hwnds; // 隶属于某个进程PID窗口句柄数组
DWORD m_nAlloc; // 数组大小
DWORD m_count; // 找到的窗口句柄数
DWORD m_current; // 当前的窗口句柄
static BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lp);

// 虚拟枚举函数
virtual BOOL OnEnumProc(HWND hwnd);

// 在派生中改写此函数来过滤不同种类的窗口
virtual BOOL OnWindow(HWND hwnd) {
return TRUE;
}

public:
CWindowIterator(DWORD nAlloc=1024);
~CWindowIterator();

DWORD GetCount() { return m_count; }
HWND First();
HWND Next() {
return m_hwnds && m_current <m_count ? m_hwnds[m_current++] : NULL;
}
};
class CMainWindowIterator : public CWindowIterator {
protected:
DWORD m_pid; // 进程ID
virtual BOOL OnWindow(HWND hwnd);
public:
CMainWindowIterator(DWORD pid, DWORD nAlloc=1024);
~CMainWindowIterator();
};

BOOL KillProcess(DWORD pid,BOOL bZap)
{
CMainWindowIterator itw(pid);
for(HWND hwnd=itw.First();hwnd;hwnd=itw.Next())
{
DWORD bOKToKill=FALSE;
SendMessageTimeout(hwnd,WM_QUERYENDSESSION,0,0,SMTO_ABORTIFHUNG|SMTO_NOTIMEOUTIFNOTHUNG,100,&bOKToKill);
if(!bOKToKill)
return FALSE;
PostMessage(hwnd,WM_CLOSE,0,0);
}
BOOL bKilled = TRUE;
HANDLE hp=OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE,FALSE,pid);
if (hp) {
if (WaitForSingleObject(hp, 5000) != WAIT_OBJECT_0) {
if (bZap) {
TerminateProcess(hp,0);
} else {
bKilled = FALSE;
}
}
CloseHandle(hp);
}
return bKilled;
}


10 error LNK2019: 无法解析的外部符号 "public: __thiscall CMainWindowIterator::~CMainWindowIterator(void)" (??1CMainWindowIterator@@QAE@XZ),该符号在函数 "int __cdecl KillProcess(unsigned long,int)" (?KillProcess@@YAHKH@Z) 中被引用 wewe.obj

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧