模板類是乙個編譯鏈結期間才例項化的類。只有用到才例項化。標準沒有支援對模板類的匯出,從另外一種意義上來說,模板類的實現全部放在標頭檔案中,也就不需要匯出了。但是對於一些特別情況。模板類中有靜態變數和函式。這個時候dll中使用的,以及和其他鏈結這個dll的模組他們是使用的兩份拷貝。
比如, 在dll中這樣使用:
environment* dllptr = singleton::getsingleton();
然後再鏈結這個dll的exe中
environment* exeptr = singleton::getsingleton();
兩處得到的dllptr 和 exeptr 是不一樣的,因為模板類沒有匯出,所以他們使用的是兩份例項**。暫時還沒有匯出 乙個模板類的方法。
但是鑑於上述的情況,可以在定義t的dll中顯示的例項化模板類 singlton, 如下例項化,
template class singleton;
現在可以做的就是匯出這個被我們顯式例項化了的類, 如下語句
template class __declspec(dllexport) singleton;
在vs中,如果environment繼承singleton,當environment匯出時,singleton作為基類也會被匯出,所以exe檔案中呼叫singleton::getsingleton()是正常的。
但是使用gcc時,由於gcc不匯出singleton,所以在dll的**中呼叫singleton::getsingleton()和在exe中呼叫singleton::getsingleton()返回不同的位址。如果單例需要呼叫顯式初始化函式create(),則只會初始化其中之一,另乙個指標為空,從而產生錯誤。可以在非模板的子類中過載靜態的getsingleton()方法,讓其呼叫 基類的getsingleton()函式,從而使exe中呼叫的也是dll中的指標。
DLL中使用資源
1 在dll中使用對話方塊資源 hinstance hold afxgetresourcehandle afxsetresourcehandle getmodulehandle dll 開啟對話方塊 afxsetresourcehandle hold 2 在dll中使用activex控制項 hres...
跨dll中使用單例 不要使用模板
c 的模板可以幫助我們編寫適合不同型別的模板類,給 的復用性提供了極大的方便。近來寫了乙個涉及單例的c 模板類,簡化下來可以歸結為以下的 1 2 3 4 5 6 7 8 9 10 11 template typenamet classsingleton 那麼如果希望對某個work horse類,比如...
DLL和EXE的區別
動態鏈結庫 dynamic link library,縮寫為dll 是乙個可以被其它應用程式共享的程式模組,其中封裝了一些可以被共享的例程和資源。動態鏈結庫檔案的副檔名一般是dll,也有可能是drv sys和fon,它和可執行檔案 exe 非常類似.區別dll中雖然包含了可執行 卻不能單獨執行,而應...