2011-07-24 3 views
0

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

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

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

stdafx.obj : error LNK2005: "long __stdcall LowLevelKeyboardProc(int,unsigned int,long)" ([email protected]@[email protected]) already defined in main.obj 
1>main.obj : error LNK2001: unresolved external symbol "protected: static class LowLevelKeyboardHookEx * LowLevelKeyboardHookEx::instance" ([email protected]@@[email protected]) 
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 

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

ответ

0

Переведите определение 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

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

0

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

Смежные вопросы