简单的DLL给了我奇怪的编译错误

use*_*747 1 c++ dll winapi compilation

我正在创建我的第一个DLL.我只有一个单例类和一个LRESULT CALLBACK函数,我将在DLL中创建并导入到我的一个项目中.我的MSVC++项目体系结构包含DLLMain.cpp文件(未更改),定义单例类和LRESULT函数的头文件以及实现LRESULT函数的cpp文件.

我的问题:该项目没有编译.我有2个编译错误,我不明白什么是完全错误以及如何解决它.

1> c:\ users\testcreatedll\dlltest.h(15):错误C2059:语法错误:'__ declspec(dllexport)'
1> c:\ users\testcreatedll\dlltest.h(39):错误C2065:'TestWndProc' :未声明的标识符

我的头文件:

#ifndef DLLTEST_H
#define DLLTEST_H

#include <windows.h>

// This is from a tutorial I am following
#ifdef _CLASSINDLL
#define CLASSINDLL_CLASS_DECL __declspec(dllexport)
#else
#define CLASSINDLL_CLASS_DECL __declspec(dllimport)
#endif

namespace MyTest
{
    LRESULT CALLBACK CLASSINDLL_CLASS_DECL TestWndProc( HWND hwnd, UINT msg, LPARAM lParam, WPARAM wParam );

    class CLASSINDLL_CLASS_DECL TestClass
    {
        // Singleton class
        public:
            static bool testStaticVar;

            static TestClass* getInstance()
            {
                if ( instance == NULL ) { instance = new TestClass(); }
                return instance;
            }

            void add()
            {
                myMember++;
            }

        private:
            static TestClass* instance;
            WNDPROC myProc;
            int myMember;

            TestClass() : myMember(0) { myProc = (WNDPROC)&TestWndProc; }
            ~TestClass()              {}

    };
}

#endif // DLLTEST_H
Run Code Online (Sandbox Code Playgroud)

我的cpp文件:

#include "stdafx.h"
#include "DLLTest.h"

namespace MyTest
{
    // Create/Initialise? Class Static variables
    bool TestClass::testStaticVar = false;
    TestClass* TestClass::instance = NULL;

    LRESULT CALLBACK TestWndProc( HWND hwnd, UINT msg, LPARAM lParam, WPARAM wParam )
    {
        switch (msg)
        {
            case WM_CREATE:
            {

            }
            break;
            default:
            break;
        }

        return DefWindowProc(hwnd, msg, wParam, lParam);
    }

}
Run Code Online (Sandbox Code Playgroud)

gre*_*olf 5

C++编译器可能非常挑剔您声明调用约定和存储类信息的顺序(可视导出__declspec).AFAIK,VC++需要在存储类之后出现调用约定.例如:

namespace MyTest
{
  LRESULT CLASSINDLL_CLASS_DECL CALLBACK TestWndProc( HWND hwnd, UINT msg, LPARAM lParam, WPARAM wParam );

  // ...
}
Run Code Online (Sandbox Code Playgroud)

另一方面,C++ Builder 2007和MinGW-GCC-4.5.2并不关心这一点 - 两种形式都被接受.