Конструктор C ++ в DLL не создает проблемы - PullRequest
1 голос
/ 08 ноября 2011

Я скомпилировал и построил проект DLL в VS 2010. У меня есть добавленный родственный проект к тому же решению, который по существу будет ссылаться на вышеупомянутую DLL и должен загрузить ее конструктор и функциональные возможности. Однако, как только я пытаюсь создать экземпляр объекта, он дает access violation.

В основном я делаю это ..

#include <iostream>
#include "MCaromDLL.h"

using namespace std;
using namespace MagneticCarom;

int main() {
    . . .
    MagneticCaromWrapper wrapper;
        . . .
}

Мой "MCaromDLL.h" выглядит так:

// MCaromDLL.h

#define NULL 0
#define MAX_COLS 201        //Fixed based on the FEMM values
#define MAX_ROWS MAX_COLS   //Fixed based on the FEMM values

#ifdef DLL_PROJECT 
#define DLLSPEC __declspec(dllexport)
#else
#define DLLSPEC __declspec(dllimport)
#endif

#ifndef __MCAROMDLL_H__
#define __MCAROMDLL_H__

namespace MagneticCarom
{
    . . . . . . .
    class DLLSPEC MagneticCaromWrapper
    {
        private:
                       //All private members here...            

        public:
            MagneticCaromWrapper();

            MagneticCaromWrapper(int number);

            virtual ~MagneticCaromWrapper();

                        //remaining functions
    }
}
#endif

Обратите внимание, что я пытаюсь экспортировать весь класс (хотя я пытался экспортировать отдельные функции также, но тщетно) сейчас. Весь код может быть предоставлен по запросу.

1 Ответ

2 голосов
/ 08 ноября 2011

Это всегда проблема для обработки памяти или структуры через интерфейс DLL.Что может пойти не так:

  • Разное время выполнения
  • Разное выравнивание
  • Перегружено новое ...

Чтобы убедиться, что оно работает: - Использовать чисто виртуальный интерфейс - Использовать фабричный метод - Использовать метод удаления / выпуска

IMagneticCaromWrapper* DLLSPEC FactoryMagneticCaromWrapper();

class IMagneticCaromWrapper
{
public:
    virtual void Release();
}

с реализацией.

IMagneticCaromWrapper* DLLSPEC FactoryMagneticCaromWrapper()
{
    return new MagneticCarom();
}

IMagneticCaromWrapper::Release()
{
    delete this;
}

В лучшем случае не выбрасывать исключения через границы dll.

...