Простая DLL дает мне странные ошибки компиляции - PullRequest
1 голос
/ 14 августа 2011

Я создаю свою первую DLL. У меня есть только одноэлементный класс и функция LRESULT CALLBACK, которые я создам в DLL и импортирую в один из моих проектов.Моя архитектура проекта MSVC ++ состоит из файла DLLMain.cpp (без изменений), заголовочного файла, который определяет синглтон-класс и функцию LRESULT, и файла cpp, который реализует функцию LRESULT.

Моя проблема: проект не компилируется.У меня есть 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 Ответ

5 голосов
/ 14 августа 2011
Компиляторы

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, с другой стороны, не заботятся об этом - обе формы принимаются.

...