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

时间:2011-08-14 04:51:46

标签: c++ winapi dll 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

我的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);
    }

}

1 个答案:

答案 0 :(得分:5)

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

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

  // ...
}
另一方面,C ++ Builder 2007和MinGW-GCC-4.5.2并不关心这两种形式 -