头文件中的WndProc()问题

时间:2011-07-24 06:56:02

标签: c++ winapi include

我在头文件(hook.h)中有一个LRESULT CALLBACK函数,我在文件中都转发声明然后定义(以及一些包含静态变量的类)。然后我在相关的.cpp文件(hook.cpp)中定义(实现/创建?)静态类变量。

最后,我将头文件包含在我的stdafx.h文件中,以便在程序中使用它。

因为我将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.cpp&amp;中包含hook.h文件。只包括stdafx.h,但我得到同样的问题?

3 个答案:

答案 0 :(得分:0)

它不是WndProc问题,也不是预编译头问题。它更像是在头文件中定义一个全局函数,并将其包含在两个以上的源文件中。我要说的是要么将函数定义放在源文件中,要么使用类静态函数。

答案 1 :(得分:0)

您应该将KeyboardProc的实施放在hook.cpp文件中。将原型留在标题中,但将代码移到.cpp

答案 2 :(得分:0)

将KeyboardProc的定义(或者是LowLevelKeyboardProc?)移动到hook.cpp中。也就是说,将此代码从hook.h移动到hook.cpp

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

但是在hook.h中保留KeybaordProc的“声明”。也就是说,将此行留在hook.h:

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

这样,任何其他源文件都可以引用KeyboardProc,但只链接了该函数的一个定义。

有一些替代解决方案,包括一些“内联”关键字和可能的pragma / declspec指令,以使其工作。对你想做的事情似乎都没有。