我很难理解为什么这个符号没有定义,而是在main.cpp中定义的。代码如下:
记忆类:
#pragma once
#include "CrownIncludes.h"
class Memory {
public:
template<typename T>
inline T Read(std::uintptr_t ptrAddress) const
{
T val = T();
ReadProcessMemory(procHandle, (LPCVOID)ptrAddress, &val, sizeof(T), NULL);
return val;
}
private:
HANDLE procHandle = Settings::pHandle;
};
CrownIncludes.h
#pragma once
#include <Windows.h>
#include <TlHelp32.h>
#include <Psapi.h>
#include <iostream>
#include "Global.h"
using namespace Global;
#include "Crown.h"
#include "Memory.h"
Crown.cpp:
#include "CrownIncludes.h"
//#include "Memory.h"
void Crown::Setup() {
std::cout << "Crown loading..." << std::endl;
Memory* MemoryManager = new Memory();
DWORD LocalPlayer = 0x0;
MemoryManager->Read(0x02C8 + 0x0390, LocalPlayer);
std::cout << LocalPlayer << std::endl;
}
Main.cpp的:
...
std::cout << "Success! (" << TargetProcess->GetHandle() << ")" << std::endl;
HANDLE pHandle = TargetProcess->GetHandle();
// Main
Crown::Setup();
...
错误:
Fehler LNK2001 Nicht aufgelöstes externes Symbol ""void * Global::Settings::pHandle" (?pHandle@Settings@Global@@3PEAXEA)" Crown.obj
取消注释Memory * MemoryManager = new Memory();代码有效。 (所以我猜想记忆类无法找到pHandle)
答案 0 :(得分:0)
你现在可能已经想到了,但不管将来的读者如何,我都会回答。
如果您正在使用C ++ 11(或更高版本),并希望简单地将procHandle
初始化为null
:
// (Memory.h)
//...
HANDLE procHandle = nullptr;
你已经完成了。
我认为你混淆了两个不同的pHandle
标识符。 pHandle
中定义了main()
,但它是一个局部变量,与错误引用的Global::Settings::pHandle
不同。您没有为后者提供代码,因此仅基于错误而未在Global.cpp
中初始化它
或Settings.cpp
(Global::Settings
的cpp文件)。
修复是确保在相关的cpp文件中初始化Global::Settings::pHandle
:
// (Global.cpp/Settings.cpp)
//...
HANDLE Global::Settings::pHandle = nullptr;
或者,在课堂上初始化它:
// (Global.h/Settings.h)
//...
HANDLE pHandle = nullptr;
在Memory.h
中,您正在初始化procHandle
到Settings::pHandle
,根据错误以及您使用它做的事情表明Settings::pHandle
不能是constexpr。数据成员只能在类中初始化为constexpr值,否则您将不得不使用构造函数,因为需要在运行时读取非constexpr值。
// If Settings::pHandle is constexpr. i.e. pHandle is a nullptr alias.
//...
HANDLE procHandle = Settings::pHandle;
//...
// If Settings::pHandle is NOT constexpr.
//...
Memory() :
procHandle(Settings::pHandle) {}
//...
private:
HANDLE procHandle;
//...