Объектно-ориентированное программирование c ++ dll Code :: Blocks - PullRequest
0 голосов
/ 03 февраля 2012

Я работаю над oop c ++ с code :: Blocks.

Это мои первые шаги в oop, потому что я программирую на C для микропроцессоров.

У меня проблемы с подключениемdll.

Мой главный из проекта dll:

#include "main.h"
#include "xclass.h"

// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}

Это заголовок:

#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>
#include "xclass.h"

/*  To use this exported function of dll, include this header
 *  in your project.
 */
#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

void DLL_EXPORT SomeFunction(const LPCSTR sometext);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

Основные вещи, как вы можете видеть.

Проблема в том, что я включаю класс xclass в main:

#include "xclass.h"
xclass::xclass()
{
    //ctor
}

xclass::~xclass()
{
    //dtor
}

и заголовок

#ifndef XCLASS_H
#define XCLASS_H

class xclass
{
    public:
        xclass();
        virtual ~xclass();
        unsigned int GetCounter() { return m_Counter; }
        void SetCounter(unsigned int val) { m_Counter = val; }
    protected:
    private:
        unsigned int m_Counter;
};

#endif // XCLASS_H

Мне удалось связать и использовать dll в другом проекте.Я даже могу использовать функцию в DLL SomeFunction("teste x");, но я не могу получить доступ и использовать класс:

#include <iostream>
#include "main.h"
//#include "../cvWrapper/main.h"

using namespace std;

int main()
{
    xclass ClassInDll;// not working

    SomeFunction("teste x"); //using the function in dll

    printf("%d\n", 1);
    return 0;
}

Ошибка сборки:

|| ===testDLL, Debug === |obj \ Debug \ main.o || В функции main':| C:\Users\SoftVision\Desktop\PrinterCode\DLL_test\testDLL\main.cpp|9|undefined reference to xclass :: xclass () '|C: \ Users \ SoftVision \ Desktop \ PrinterCode \ DLL_test \ testDLL \ main.cpp | 14 | неопределенная ссылка на xclass::~xclass()'| C:\Users\SoftVision\Desktop\PrinterCode\DLL_test\testDLL\main.cpp|14|undefined reference to xclass :: ~ xclass () '||| === Сборка завершена: 3 ошибки, 0 предупреждений === |

Спасибо за помощь ...

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

На самом деле вы должны экспортировать класс:

class DLL_EXPORT xclass
{
    public:
        xclass();
        virtual ~xclass();
        unsigned int GetCounter() { return m_Counter; }
        void SetCounter(unsigned int val) { m_Counter = val; }
    protected:
    private:
        unsigned int m_Counter;
};

Будьте осторожны при экспорте класса, который не является чисто виртуальным классом, поскольку вы можете столкнуться с некоторыми проблемами с выравниванием памяти.Это происходит из-за разных версий RTL в разных компиляторах.Вместо этого экспортируйте чистый виртуальный интерфейс вашего класса.

class DLL_EXPORT IXClass
{
    public:
        IXClass();
        virtual ~IXClass();
        virtual unsigned int GetCounter()=0;
        virtual void SetCounter(unsigned int val) =0;
};

Также избегайте макросов ... Удачи:).

0 голосов
/ 03 февраля 2012

Вам тоже нужно экспортировать класс:

class DLL_EXPORT xclass {
  //...

Возможно, вам придется немного переставить заголовки - например, поместите #define для DLL_EXPORT где-нибудь, что может быть включено как в main.h, так и в xclass.h.

http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL

...