Странное поведение при включении заголовочных файлов - PullRequest
0 голосов

Итак, я пытался включить заголовочный файл в заголовочный файл, чтобы я не получил ошибок компоновщика. Но я столкнулся с проблемой: несмотря на то, что файлы 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 показывает тот же результат, что и ошибки компилятора.

1 Ответ

0 голосов

Решено; Все, что мне нужно было сделать, это просто восстановить файл Visuals.h. Должна быть ошибка компилятора или что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...