2011-03-16 41 views
0

所以我剛開始嘗試模擬經過多年的推敲,不知道從哪裏開始,並且我已經成功地編寫了我的第一個模擬器!現在我正在組織我的代碼,以便可以重新使用代碼來模擬其他系統。我一直在玩弄有一個共享前端「平臺處理程序」的概念,我將編譯爲我的可執行文件,而我將編譯我的模擬系統代碼到dll中,平臺處理程序將使用它來識別哪些可用並實例化。這將允許我將我的代碼分離到不同的項目中,並讓選項開放使用具有更多功能的更大型前端或簡化的「遊戲」,並在它們之間共享相同的dll,而不是製作兩種不同的解決方案。VC++:使用DLL作爲「子程序」

我知道如何編譯dll vs可執行文件,但我不知道如何將可執行文件鏈接到自定義dll,以便我可以從中實例化一個類。我甚至不確定我想要做什麼在技術上是可行的。 dll類需要是靜態的嗎?我以前從來沒有編寫過這樣的代碼,或者甚至用自定義dll做了很多,所以任何幫助或想法都不勝感激。我正在使用Visual C++ 2010。預先感謝任何人的建議。

+0

這很好包含在MSDN Library中。開始閱讀這裏:http://msdn.microsoft.com/en-us/library/1ez7dh12.aspx –

回答

0

你不需要做太多的改變。就像你爲函數一樣從dll導出你的類。在您的應用程序中,像通常一樣包含標題和鏈接到生成的庫。看到這個頁面:http://msdn.microsoft.com/en-us/library/81h27t8c%28v=vs.80%29.aspx

example.h文件

#ifdef DLL_EXPORT 
#define EXPORT_API __declspec(dllexport) 
#else 
#define EXPORT_API __declspec(dllimport) 
#endif 

class EXPORT_API Example 
{ 
public: 
    Example(); 
    ~Example(); 

    int SomeMethod(); 
}; 

int EXPORT_API ExampleFuncion(); 

Example.cpp

#include "Example.h" 

Example::Example() 
{ 
    // construct stuff 
} 

Example::~Example() 
{ 
    // destruct stuff 
} 

int Example::SomeMethod() 
{ 
    // do stuff 
    return 0; 
} 

int EXPORT_API ExampleFunction() 
{ 
    return 0; 
} 

在DLL項目,定義DLL_EXPORT和建設。你會得到一個.lib.dll輸出。在你的主要項目中,你將使用dll,除了包含頭文件和鏈接.lib之外,你不必做任何事情。請勿在主項目中定義DLL_EXPORT符號,並確保.dll位於應用程序可以找到的位置。

如果你真的想變得聰明,這個問題是尖銳的工廠設計模式。如果你設計的界面足夠好,你可以讓你的DLL在你的應用程序加載時註冊它們的實現。你甚至可以永遠不用重建你的主要可執行文件。

+0

這聽起來很像我想做的事情。這個操作系統具體嗎?到目前爲止,我的應用程序是跨平臺友好的,我真的想保持這種方式。無論如何,當我指向MSDN的方向時,我會感到緊張,儘管這是一個很好的資源。 – user663000

+0

不,我在Windows和Linux上都做過。我認爲它適用於支持加載共享對象的任何平臺。 IIRC在Linux上,你不必做任何特殊的事情,只需創建共享對象(dll)並鏈接到它。在Windows上,您必須特別聲明該類爲導出,如鏈接中所述。我沒有一個方便的代碼片段,並且我毫不猶豫地從內存中創建一個,因爲我可能會錯過一些東西。看看谷歌上的dllimport/dllexport。我下班回家時會檢查一下,並試着提供一個更好的例子。 –

+0

非常感謝你!這看起來正是我想要做的事情。工廠方法聽起來也是設置平臺處理程序的完美方式。時間去除ol設計模式書並獲得編碼! – user663000