C ++ | DLL / EXE - Как вызвать другой метод класса из экспортированного класса? - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть проект, в котором я хочу использовать DLL.

Я экспортирую фабричную функцию в свой exe:

extern "C" __declspec(dllexport) 
BaseInit* __cdecl CreateInterface( void ) 
{
    return new Initializer;
}

Это прекрасно работает.В моем классе Init у меня есть метод для создания другого класса, который я хочу удобно использовать из моего класса Initializer:

class IAnotherClass {
public:
    virtual void TestFunction();
   ...
class AnotherClass : public IAnotherClass {
public:
    void TestFunction();
  ...
class Initializer : public BaseInit
{
    IAnotherClass* Create(void)
    {
        return new AnotherClass;
    }
    ...

Это также, кажется, работает.Я получаю ненулевой указатель.Однако при попытке вызвать TestFunction из этого класса (в моей exe-программе) я получаю:

LNK2001 неразрешенный внешний символ "public: virtual void __cdecl AnotherClass :: TestFunction (void)" (?TestFunction @ AnotherClass @@ UEAAXXZ)

void AnotherClass::TestFunction - тело находится в отдельном .cpp-файле в моем проекте DLL

Я делаю это неправильно, и мне действительно нужны отдельные функции фабрикидля каждого отдельного экземпляра класса?Можно ли вообще так сделать?

1 Ответ

0 голосов
/ 16 сентября 2018

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

Обратите внимание, что в классах declspec идет между class и именем класса:

class __declspec(dllexport) Exported
{
};

Вам также потребуется определенный макрос, который переключает ваши заголовки между __declspec(dllexport) и __declspec(dllimport) в зависимости от того, строите ли вы dll или exe, например ::

#ifdef BUILDING_MYDLL
#define MYDLL_EXPORT __declspec(dllexport)
#else
#define MYDLL_EXPORT __declspec(dllimport)
#endif

class MYDLL_EXPORT Exported
{
};
...