【问题标题】:Simple DLL giving me weird compile errors简单的 DLL 给了我奇怪的编译错误
【发布时间】:2011-08-14 04:51:45
【问题描述】:

我正在创建我的第一个 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);
    }

}

【问题讨论】:

    标签: c++ winapi dll compilation


    【解决方案1】:

    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 并不关心这一点——两种形式都被接受。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-11
      • 2013-04-26
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 2011-01-22
      • 2016-01-23
      相关资源
      最近更新 更多