看起来像这样:
error LNK2005: "unsigned long __cdecl GetModuleBase(void *,
class std::basic_string<char,struct std::char_traits<char>,
class std::allocator<char> > &)"
(?GetModuleBase@@YAKPAXAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
already defined
我最近添加的代码:
#include "Windows.h"
#include <TlHelp32.h>
#include <psapi.h>
#include <string>
#pragma comment(lib, "psapi")
//#pragma comment(lib, "TlHelp32") i could not find where this lib located
using namespace std;
DWORD GetModuleBase(HANDLE hProc, string &sModuleName)
{
HMODULE *hModules;
char szBuf[50];
DWORD cModules;
DWORD dwBase = -1;
//------
EnumProcessModules(hProc, hModules, 0, &cModules);
hModules = new HMODULE[cModules/sizeof(HMODULE)];
if(EnumProcessModules(hProc, hModules, cModules/sizeof(HMODULE), &cModules)) {
for(int i = 0; i < cModules/sizeof(HMODULE); i++) {
if(GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf))) {
if(sModuleName.compare(szBuf) == 0) {
dwBase = (DWORD)hModules[i];
break;
}
}
}
}
delete[] hModules;
return dwBase;
}
我不明白这是什么,也许我使用错误的代码? 或者需要TlHelp32.lib,但VS说它找不到这样的静态库。
答案 0 :(得分:4)
命名空间Microsoft::WRL
中有GetModuleBase
function。
您的代码包含Microsoft的功能(在项目的另一部分,它是内部的),因此在链接阶段它会引发错误。
更改函数名称或使用命名空间。
答案 1 :(得分:0)
您的GetModuleBase()函数定义了两次,链接器无法解决该冲突。搜索“ GetModuleBase”,您将找到它。
理想情况下,您将在标头中一次声明函数原型,如下所示:
DWORD GetModuleBase(HANDLE hProc, string &sModuleName);
在标头文件的顶部使用标头保护或至少使用此预处理程序指令:
#pragma once
然后在.cpp文件中定义一次GetModuleBase(),在此.cpp文件中,您需要包括头文件。删除此函数的所有其他声明或定义,即可解决您的问题。
每当您遇到此问题时,快速的解决方案是CTRL-F打开查找提示并搜索函数名称,您将使用此方法快速识别冲突。