Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с загрузкой DLL (где используются классы) 
:(
    Опции темы
erslgoeirjh
Дата 2.2.2015, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005

Репутация: нет
Всего: нет



Есть проект DLL--DLLIntegr, собранный в Visual Studio 2008.
В его файлах написано следующее:

1) файл DLLIntegr.h :

Код

class T3DMatrix;
class T3DVector
{
  friend class T3DMatrix;
  public:
  long double x, y, z;
  T3DVector();
  T3DVector(const T3DVector& v);
  T3DVector(long double x0, long double y0, long double z0);
  // заголовки прочих методов класса T3DVector;
};

class T3DMatrix
{
  public:
  LDouble a[3][3];
  T3DMatrix();
  T3DMatrix(const T3DMatrix& m);
  T3DMatrix(long double a00, long double a01, long double a02,
            long double a10, long double a11, long double a12,
            long double a20, long double a21, long double a22);
  // прочие методы класса T3DMatrix
};


Реализация методов классов T3DVector и T3DMatrix произведены в файле 3dvecmat.cpp .

Также в файле DLLIntegr.h определены следующие структуры и классы:

Код

typedef struct
{
  int flag;
  char* NAMEpol;
  int n0;
  int ntes;
  int PR_atm;
  long double Sb;
} ModelEarthForc;

typedef struct
{
  int Grav;
  int Atm;
  int Sun;
  int Moon;
  int SunPr;
  long double m_Kappa;
  ModelEarthForc m_MEF;
} ModelForc;

typedef struct
{
  int SunPr;
  int Moon;
  int Sun;
  int Grav;
  int Atm;
  int n_z;
  int n_t;
} ModelForc_Var;

struct q_Var
{
  int k;
  long double Sb;
  long double kappa;
};

struct NewSatInit
{
  long id;
  char Nameobj[20];
  LDouble mu;
  ModelForc mfe;
  int Nvit;
  int refSysCodeIn;
  int TimeIn;
  long jt0;
  T3DVector rv0[2];
  long double epsTime;
  short PowerIntegr;
  short Flag_Integr;
  long double v_epsTime;
  short v_PowerIntegr;
  ModelForc_Var* var;
  q_Var* v_q;
};

class ISatellite
{
  public:
  virtual T3DVector __stdcall SetTime(long jt, long double tj)=0;
  virtual void __stdcall GetCurrentVector(T3DVector *rv, short whatCalc=1)=0;
  friend int __stdcall INewSatellite(ISatellite* isat);
  friend void __stdcall INewSat_integ(ISatellite& isat);
  virtual ~ISatellite(){};
  protected:
  // прочие члены класса ISatellite
}

typedef ISatellite* (__cdecl *create_t)(NewSatInit nst);

class Satellite : public ISatellite
{
  public:
  Satellite(NewSatInit nst);
  virtual ~Satellite();
  virtual T3DVector __stdcall SetTime(long jt, long double tj);
  virtual void __stdcall GetCurrentVector(T3DVector *rv, short whatCalc=1);
  friend int __stdcall NewSatellite(Satellite* sat);
  friend void __stdcall NewSat_integ(Satellite& sat);
  // прочие члены класса Satellite;
};


2) в файле DLLIntegr.cpp :

Код

Satellite::Satellite(NewSatInit st)
{
  // реализация конструктора класса Satellite;
}

Satellite::~Satellite()
{
  // реализация деструктора класса Satellite;
}

T3DVector Satellite::SetTime(long jt, long double tj)
{
  // реализация функции SetTime класса Satellite;
  return m_RVCur[0]; // m_RVCur[2] -- поле типа T3DVector класса Satellite
}

void Satellite::GetCurrentVector(T3DVector *rv, short whatCalc)
{
  rv[0] = m_RVCur[0];
  if (whatCalc!=0)
  {
    rv[1] = m_RVCur[1];
  }
}

int __stdcall NewSatellite(Satellite* sat)
{
  // реализация функции NewSatellite;
  return 0; // в случае успешного выполнения функции
}

int __stdcall INewSatellite(ISatellite* isat)
{
  int i;
  i = NewSatellite((Satellite*)isat);
  return i;
}

void __stdcall NewSat_integ(Satellite& sat)
{
  // реализация функции NewSat_integ;
}

void __stdcall INewSat_integ(ISatellite& isat)
{
  NewSat_integ((Satellite&)isat);
}


3) в файле dllmain.cpp :

Код

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

extern "C" DLLINTEGR_API ISatellite* __cdecl create(NewSatInit nst)
{
  return new Satellite(nst);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
  switch (ul_reason_for_call)
  {
    case DLL_PROCESS_ATTACH:
                       break;
    case DLL_THREAD_ATTACH:
                       break;
    case DLL_THREAD_DETACH:
                       break;
    case DLL_PROCESS_DETACH:
                       break;
  }
  return TRUE;
}


Эта dll (DLLIntegr) нормально компилируется--создаются файлы DLLIntegr.dll и DLLIntegr.lib .

Теперь я создаю вызывающую её программу--CallDLLIntegr. В проект этой программы я перебросил файл DLLIntegr.h .
Файл CallDLLIntegr.cpp :

Код

#include "stdafx.h"
#include "DLLIntegr.h"

ISatellite* isat = NULL;

typedef int (*nsfunc)(ISatellite* isat);

int _tmain(int argc, _TCHAR* argv[])
{
  int i;
  long jt;
  long double tj;
  T3DVector rv[2];
  struct NewSatInit nst;
  nsfunc  mynsfunc;

  HINSTANCE h = LoadLibrary(L"DLLIntegr.dll");
  if (!h)
  {
    printf("Ошибка загрузки DLLIntegr.dll .\n");
    exit(0);
  }
  create_t create = (create_t)GetProcAddress(h,"create");
  if (!create)
  {
    printf("Ошибка вызова функции create .\n");
    exit(0);
  }
  ISatellite* isat = create(nst);
  mynsfunc = (nsfunc)GetProcAddress(h,"INewSatellite");
  if (!mynsfunc)
  {
    printf("Ошибка вызова функции INewSatellite .\n");
    exit(0);
  }
  i = mynsfunc(isat);
  isat->SetTime(jt,tj);
  isat->GetCurrentVector(rv,1);
  delete isat;
  FreeLibrary(h);
  return 0;
}


При компиляции этой вызывающей прогарммы выдаются ошибки:

error LNK2019: ссылка на неразрешенный внешний символ "public:__thiscall T3DVector::T3DVector(void)"(??0T3DVector@@QAE@XZ) в функции _wmain

error LNK2019: ссылка на неразрешенный внешний символ "public:__thiscall T3DVector::T3DVector(class T3DVector const&)"(??0T3DVector@@QAE@ABV0@@Z) в функции "public:__thiscall NewSatInit::NewSatInit(class NewSatInit const&)"(??0NewSatInit@@QAE@ABU0@@Z)

При этом, если в файле DLLIntegr.h в структуре NewSatInit закомментировать поле T3DVector rv0[2]; , а в файле CallDLLIntegr.cpp закомментирвоать строки T3DVector rv[2]; и isat->GetCurrentVector(rv,1); , то тогда эта программа нормально компилируется.
Такое ощущение, что компилятору не нравится, как описан или определён класс T3DVector.

Как решить эту проблему? Как сделать так, чтобы в моей вызывающей программе CallDLLIntegr с классами T3DVector и T3DMatrix не было бы проблем?

PM MAIL   Вверх
vol4ek
Дата 2.2.2015, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: -1
Всего: 0



проект dll выложите
PM MAIL ICQ   Вверх
erslgoeirjh
Дата 4.2.2015, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005

Репутация: нет
Всего: нет



И ещё вопрос: в классе ISatellite объявлены дружественные функции INewSatellite и INewsat_integ, а в его наследнике, классе Satellite, объявлены дружественные функции NewSatellite и Newsat_integ. Эти четыре функции объявлены как __stdcall.

После исправления своей ошибки с классами T3DVector и T3DMatrix у меня компилируется программа, более того--в клиентской программе вызывается конструктор класса ISatellite, который вызывает конструктор класса Satellite, который благополучно работает.
Но после этого, при загрузке адреса функции INewSatellite из библиотеки DLLIntegr.dll у меня возвращается NULL.
(Функция INewSatellite вызывает функцию Satellite, а функция INewsat_integ вызывает функцию Newsat_integ).

То есть у меня неправильно экспортируются функции INewSatellite, INewsat_integ, NewSatellite, Newsat_integ.

Как правильно их экспортировать? Через extern "C" DLLINTEGR_API ? Но как быть тогда с дружественным объявлением этих функций в классах ISatellite, Satellite?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.