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

Simple DLL giving me weird compile errors

本文关键字:编译 错误 DLL 简单      更新时间:2023-10-16

我正在创建我的第一个DLL。我只有一个单例类&我将在DLL中创建一个LRESULT CALLBACK函数。导入到我的一个项目中。我的msvc++项目架构由DLLMain.cpp文件(未修改)组成,该文件是一个头文件,它定义了单例类&LRESULT函数&实现LRESULT函数的cpp文件。

我的问题:项目没有编译。我有2个编译错误,我不明白到底是什么错了&如何修复

1>c:userstestcreatedlldlltest.h(15): error C2059:语法错误:'__declspec(dllexport)'
1>c:userstestcreatedlldlltest.h(39):错误C2065: 'TestWndProc':未声明的标识符

My header file:

#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

My cpp file:

#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);
    }
}

c++编译器可以非常挑剔声明调用约定和存储类信息的顺序(使用__declspec导出可见性)。当然,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,另一方面,不关心这个——两种形式都被接受。