Эй, я пытаюсь написать 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.
Если я понимаю, что проблема заключается не в том, что вы не знаете, как загрузить класс, но не можете себе представить, как использовать его впоследствии? Я не могу помочь с синтаксисом, потому что я использую динамическую загрузку разделяемых объектов, а не 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, поэтому надеюсь, что это поможет понять мой комментарий.
LoadLibrary
и получать адрес экспортируемой функции через GetProcAddress
.
isid.h
Думаю, без этого не обойтись. Но все равно спасибо, это помогло.