2013-11-23 5 views
0

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

#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

http://stackoverflow.com/questions/110833/dynamically-importing-ac-class-from-a-dll – user2176127

+0

Несмотря на то, что приведенная выше нить хороша, одним словом, вы можете взять класс интерфейса из dll в отдельный заголовок, а затем методы вызова с помощью базового указателя, назначенного экземпляру Create-ed. –

+0

Решение в нем показывает, как загружать функции из Dll, и я это уже знаю. Я не могу понять, как загрузить класс. Я не уверен, как загрузить эту функцию Create, так как при создании typdef для этого мне нужен тип возврата, но я не хочу включать заголовок. – Xk0nSid

ответ

1

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

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

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

// 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, но я не хочу чтобы узнать интерфейс windows dll сейчас, поэтому я надеюсь, что это поможет понять мой комментарий.

+0

В Windows вы можете динамически загружать библиотеку с помощью 'LoadLibrary' и получать адрес экспортируемой функции через' GetProcAddress'. – user2176127

+0

Большое вам спасибо, что это действительно помогло. Я просто пытался найти способ сделать это, не включив заголовок 'isid.h'. Угадай, что не получится. Но спасибо в любом случае, это помогло. – Xk0nSid