Итак, я пытался включить заголовочный файл в заголовочный файл, чтобы я не получил ошибок компоновщика. Но я столкнулся с проблемой: несмотря на то, что файлы Hooks.h и Visuals.h включены в один заголовочный файл, Hooks.h работает отлично. Никаких ошибок и intellisense не видит.
#pragma once
namespace Hooks {
// VMTHook, which was included in the parent header file, works.
// Moreover, IDirect3DDevice is defined here, same with HRESULT.
VMTHook D3DDeviceHooks;
VMTHook CHLClientHooks;
VMTHook ClientModeHooks;
/**
* Setups all the hooks.
*/
void SetupHooks() {
D3DDeviceHooks = VMTHook(g_pD3ddevice);
CHLClientHooks = VMTHook(g_pClient);
ClientModeHooks = VMTHook(g_pClientmode);
Visuals::Hooks::orgEndScene = (Visuals::Hooks::EndSceneFn)D3DDeviceHooks.HookFunction(42, Visuals::Hooks::hookEndScene);
}
}
Но проблемы возникают с Visuals.h. Включения, которые у меня были в родительском заголовочном файле, не работают. Сам компилятор выдает ошибки (intellisense тоже)
#pragma once
namespace Visuals {
namespace Hooks {
typedef HRESULT(__stdcall* EndSceneFn)(IDirect3DDevice9*);
// IDirect3DDevice9 is not defined, same with HRESULT
EndSceneFn orgEndScene = nullptr;
HRESULT __stdcall hookEndScene(IDirect3DDevice9* device)
{
if (!Visuals::Initialized)
Visuals::Initialize(device);
Visuals::Draw(g_pGlobalvars->frametime);
return orgEndScene(device);
}
WNDPROC orgWndProc = 0;
// WNDPROC is not defined.
LRESULT __stdcall hookWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
if ((msg == WM_KEYDOWN || msg == WM_KEYUP) && (wParam == Visuals::Menu::Variables::MenuHotkey)) {
Visuals::Menu::Open();
}
return CallWindowProcA(orgWndProc, hwnd, msg, wParam, lParam);
}
}
...
Вот файл, в который они оба включены:
... // Has many includes, such as "windows.h" and "d3d9"
#include "sdk/Definitions.h"
#include "Utils/PatternScans.h"
#include "Visuals.h"
#include "Menu.h"
#include "VMTHook.h"
#include "Hooks.h"
Вероятно, вы можете выдать это самостоятельно, повторив эти простые шаги:
- Создание простого исполняемого проекта c ++ в Visual Studio 2017 (компилятор MSV C)
- Создание файла заголовка, создание еще 2
- Включение обоих эти файлы в первом файле заголовка, который вы сделали
- Добавьте несколько включений в один и тот же файл, например, "stdio"
- Проверьте, существуют ли определения stdio в обоих этих файлах, вероятно, их не должно быть в одном из них.
Кстати, я не думаю, что это проблема компилятора, потому что intellisense показывает тот же результат, что и ошибки компилятора.