Как использовать экспортированный класс из DLL

0

Эй, я пытаюсь написать Game-Engine, и я пытался экспортировать класс в Dll и пытался использовать его в своем основном коде. Подобно использованию функции loadlibrary(). Я знаю, как экспортировать и использовать функции в и из Dll. Но я хочу экспортировать классы, а затем использовать их так же, как я использую функции. Я не хочу include <headers> для этого класса, а затем использовать его. Я хочу, чтобы это было временем выполнения. У меня есть следующий код для очень простого класса, который я использовал, чтобы просто экспериментировать с ним.

#ifndef __DLL_EXP_
#define __DLL_EXP_

#include <iostream>

#define DLL_EXPORT __declspec(dllexport)

class ISid
{
public:
virtual void msg() = 0;
};

class Sid : public ISid
{
void msg()
{
    std::cout << "hkjghjgulhul..." << std::endl;
}
};

ISid DLL_EXPORT *Create()
{
return new Sid();
}

void DLL_EXPORT Destroy(ISid *instance)
{
   delete instance;
}

#endif

Как использовать это в своем основном коде? Любая помощь будет действительно оценена. В случае, если это важно, я на Visual Studio 2012.

  • 0
    stackoverflow.com/questions/110833/...
  • 0
    Хотя вышеуказанный поток хорош, короче говоря, вы можете взять интерфейсный класс из dll в отдельный заголовок и затем вызывать методы через базовый указатель, назначенный экземпляру Create-ed.
Показать ещё 2 комментария
Теги:
dll
dllimport
dllexport

1 ответ

1
Лучший ответ

Если я понимаю, что проблема заключается не в том, что вы не знаете, как загрузить класс, но не можете себе представить, как использовать его впоследствии? Я не могу помочь с синтаксисом, потому что я использую динамическую загрузку разделяемых объектов, а не dll, но usecase заключается в следующем:

// isid.h that gets included everywhere you want to use Sid instance
class ISid
{
public:
    virtual void msg() = 0;
};

Если вы хотите использовать динамически загруженный код, вы все равно должны знать его интерфейс. Вот почему я предлагаю вам переместить интерфейс в обычный заголовок не-dll

// sid.h
#ifndef __DLL_EXP_
#define __DLL_EXP_

#include <iostream>
#include "isid.h" // thus you do not know what kind of dll you are loading, but you are well aware of the interface

#define DLL_EXPORT __declspec(dllexport)
class Sid : public ISid
{
void msg()
{
    std::cout << "hkjghjgulhul..." << std::endl;
}
};

ISid DLL_EXPORT *Create()
{
    return new Sid();
}

void DLL_EXPORT Destroy(ISid *instance)
{
    delete instance;
}

#endif

И тогда вы делаете что-то вроде этого:

// main.cpp
#include <sid.h>
int main()
{
 // windows loading magic then something like where you load sid.dll
.....
typedef ISid* (*FactoryPtr)();
FactoryPtr maker = (FactoryPtr) dlsym(symHanlde, "Create");
ISid* instance = (*maker)();
instance->msg();
...
}

Извините, я не могу предоставить код dll, но сейчас я не хочу изучать интерфейс dll windows, поэтому надеюсь, что это поможет понять мой комментарий.

  • 0
    В Windows вы можете динамически загружать библиотеку с помощью LoadLibrary и получать адрес экспортируемой функции через GetProcAddress .
  • 0
    Большое вам спасибо, это действительно помогло. Я просто пытался найти способ обойтись без включения заголовка isid.h Думаю, без этого не обойтись. Но все равно спасибо, это помогло.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню