Проблема с WndProc () в заголовочном файле - PullRequest
0 голосов
/ 24 июля 2011

У меня есть функция LRESULT CALLBACK в заголовочном файле (hook.h), которую я оба вперед объявляю, а затем определяю в файле (вместе с некоторыми классами, которые содержат статические переменные).Затем я определяю (реализовать / создавать?) Переменные статического класса в связанном файле .cpp (hook.cpp).

Наконец, я включаю файл заголовка в свой файл stdafx.h, чтобы я мог использовать его в своемprogram.

Так как я включаю файл hook.h дважды, я получаю ошибку компиляции, что функция LRESULT CALLBACK определяется дважды, ошибка:

stdafx.obj : error LNK2005: "long __stdcall LowLevelKeyboardProc(int,unsigned int,long)" (?LowLevelKeyboardProc@@YGJHIJ@Z) already defined in main.obj
1>main.obj : error LNK2001: unresolved external symbol "protected: static class LowLevelKeyboardHookEx * LowLevelKeyboardHookEx::instance" (?instance@LowLevelKeyboardHookEx@@1PAV1@A)
1>C:\Users\Soribo\Dropbox\C++ Programming\Visual C++ Programming\Key Cataloguer\Release\Key Cataloguer.exe : fatal error LNK1120: 1 unresolved externals

Как можно избежать этой проблемы?

Мой заголовочный файл:

#ifndef KEYBOARDHOOK_H
#define KEYBOARDHOOK_H

#include "stdafx.h"

LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam );

class MyClass {
    public:
      static std::string instanceStr;
      // further down this class it refers to the function KeyboardProc() thus need for forward declaration
};

LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam )
{
  // implements function
}

#endif

Мой файл hook.cpp:

#include "stdafx.h"
#include "hook.h"

std::string MyClass::instanceStr = "";

Мой файл stdafx.h:

#pragma once

#include "targetver.h"

#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>

// C RunTime Header Files
#include <stdlib.h>

// Application Specific Includes
#include <string>
#include "hook.h"       // I think this is the cause of the error because I include this file twice in compilation which means that the LRESULT function is redefined/reimplemented

Я также пытался не включать файл hook.h в hook.cpp и просто включать stdafx.h, но я получаю ту же проблему?

Ответы [ 3 ]

0 голосов
/ 24 июля 2011

Вы должны поместить реализацию KeyboardProc в ваш файл hook.cpp. Оставьте прототип в заголовке, но переместите код в .cpp.

0 голосов
/ 24 июля 2011

Переместите определение KeyboardProc (или это LowLevelKeyboardProc?) В hook.cpp. То есть переместите этот код из hook.h в hook.cpp

LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam )
{
  // implements function
}

Но оставьте свое "объявление" KeybaordProc в hook.h. То есть, оставьте эту строку внутри hook.h:

LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam );

Таким образом, любой другой исходный файл может ссылаться на KeyboardProc, но в нем только одно определение функции.

Есть несколько альтернативных решений, включая некоторые встроенные ключевые слова и, возможно, директиву pragma / declspec, чтобы заставить его работать. Ни то, ни другое не кажется правильным для того, что вы хотите сделать.

0 голосов
/ 24 июля 2011

это не проблема WndProc и не проблема скомпилированного заголовка.Это скорее определение глобальной функции в заголовочном файле и включение ее в более чем два исходных файла.Что я бы сказал, это либо поместить определение функции в исходный файл, либо использовать статические функции класса.

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