2013-11-23 70 views
0

嘿,我試圖編寫一個遊戲引擎,我試圖導出一個類在一個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中取出一個單獨的頭文件,然後通過分配給創建實例的基指針調用方法。 – 2013-11-23 11:20:37

+0

其中的解決方案顯示瞭如何從Dll加載函數,我已經知道了。我無法理解如何加載課程。我不知道如何加載該Create函數,因爲在爲此創建typdef時,我需要返回類型,但我不想包含標題。 – Xk0nSid

回答

1

如果我明白問題不是你不知道如何加載類,但不能完全想象如何使用它之後呢?我不能與語法幫助,因爲我習慣了共享對象的動態加載,而不是dll的,但用例是:

// 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代碼,但我不希望現在學習Windows DLL界面,所以我希望這有助於理解我的評論。

+0

在Windows中,您可以使用'LoadLibrary'動態加載庫,並通過'GetProcAddress'獲取導出函數的地址。 – user2176127

+0

非常感謝您的幫助。我只是試圖找到一種方法,而不必包含頭文件「isid.h」。沒有那個,猜猜不能做到。但是,無論如何感謝它確實有幫助。 – Xk0nSid