我想使用 Windows 窗体编写一个程序,并且我有一个包含所需功能的头文件。但是当我连接它时,我得到一个错误:
1>MyForm.obj : error LNK2005: "unsigned long __cdecl get_module(char * const,unsigned long const &)" (?get_module@@YAKQADABK@Z) уже определен в bhop.obj
1>MyForm.obj : error LNK2005: "void __cdecl bhop(unsigned long &,void * &)" (?bhop@@YAXAAKAAPAX@Z) уже определен в bhop.obj
1>MyForm.obj : error LNK2005: "unsigned long __cdecl get_module(char * const,unsigned long const &)" (?get_module@@$$FYAKQADABK@Z) уже определен в bhop.obj
1>MyForm.obj : error LNK2005: "void __cdecl bhop(unsigned long &,void * &)" (?bhop@@$$FYAXAAKAAPAX@Z) уже определен в bhop.obj
1>MyForm.obj : error LNK2028: ссылка на неразрешенную лексему (0A00004C) "extern "C" short __stdcall GetAsyncKeyState(int)" (?GetAsyncKeyState@@$$J14YGFH@Z) в функции "void __cdecl bhop(unsigned long &,void * &)" (?bhop@@$$FYAXAAKAAPAX@Z)
1>MyForm.obj : error LNK2019: ссылка на неразрешенный внешний символ "extern "C" short __stdcall GetAsyncKeyState(int)" (?GetAsyncKeyState@@$$J14YGFH@Z) в функции "void __cdecl bhop(unsigned long &,void * &)" (?bhop@@$$FYAXAAKAAPAX@Z).
1>C:\Users\artem\source\repos\bhop_ui\Debug\bhop_ui.exe : fatal error LNK1120: неразрешенных внешних элементов: 2
1>Сборка проекта "bhop_ui.vcxproj" завершена с ошибкой.
你能告诉我你需要如何格式化头文件,这样你就可以毫无错误地连接。
附:我在 Form.h 文件中连接
#pragma once
#include "bhop.h"
#include "bhop.cpp"
namespace bhopui {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
...
bhop.h 文件的内容:
#pragma once
#include <Windows.h>
#include <TlHelp32.h>
#define dwLocalPlayer 0xD8722C
#define dwForceJump 0x52489A4
#define m_fFlags 0x104
DWORD get_module(const LPSTR module_name, const DWORD& process_id);
void bhop(DWORD& client, HANDLE& hProcess);
bhop.cpp 内容:
#pragma once
#include "bhop.h"
DWORD get_module(const LPSTR module_name, const DWORD& process_id)
{
HANDLE module_snapshot = INVALID_HANDLE_VALUE;
module_snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, process_id);
if (module_snapshot == INVALID_HANDLE_VALUE)
{
CloseHandle(module_snapshot);
return 0;
}
MODULEENTRY32 module_entry;
module_entry.dwSize = sizeof(MODULEENTRY32);
if (Module32First(module_snapshot, &module_entry))
if (!strcmp(module_name, module_entry.szModule))
{
CloseHandle(module_snapshot);
return (DWORD)(module_entry.modBaseAddr);
}
while (Module32Next(module_snapshot, &module_entry))
{
if (!strcmp(module_name, module_entry.szModule))
{
CloseHandle(module_snapshot);
return (DWORD)(module_entry.modBaseAddr);
}
}
CloseHandle(module_snapshot);
return 0;
}
void bhop(DWORD& client, HANDLE& hProcess)
{
DWORD local_player;
int flags;
const int fj = 6;
while (true)
{
ReadProcessMemory(hProcess, (LPVOID)(client + dwLocalPlayer), &local_player, sizeof(local_player), NULL);
ReadProcessMemory(hProcess, (LPVOID)(local_player + m_fFlags), &flags, sizeof(flags), NULL);
if (flags == 257 && GetAsyncKeyState(VK_SPACE) & 0x8000)
{
WriteProcessMemory(hProcess, (LPVOID)(client + dwForceJump), &fj, sizeof(fj), NULL);
}
}
}
在看到链接器错误后,我意识到这里有一个代码重新包含。
确实,
Form.h在 file 中额外包含了该文件.cpp,这并不好 - 通常源不包含在头文件中。编译后,它们是Form.obj使用bhop.obj.bhop.cpp它们是由编译器创建的,但链接器(链接器)发誓,因为名称(原型,签名)存在冲突 - 在具有相同名称的函数的第一个和第二个对象模块中。这实际上就是问题所在。通过去除处理#include "bhop.cpp"。但这还不是全部。
此错误表示存在 GetAsyncKeyState 函数的库
user32.lib未连接。您可以通过编译器指令#pragma或通过链接器设置(最好)进行连接。更多细节在这里。