如果動態使用平臺提供的API

開發工具的安裝目錄下會有include,lib目錄,這兩個目錄下存放着OS提供的API的聲明以及經過封裝的一些類以方便程序員開發,封裝的類提供的服務大多通過調用OS的API來實現,而真正提供OS的API實現的卻在一個個dll中。我們想要使用這些API或經過封裝的類的服務時,一般做法如下:

//test.cpp

#include<xxx.h>

#param comment (lib, "xxx.lib")

//調用api或使用一個經過封裝的類

使用了以上方式開發的程序不能保證在任何系統下都能正常工作,因爲在執行這個程序的時候,系統會動態加載系統用到的各個dll,程序依賴的這些dll不一定都存在於系統中,例如gdiplus.dll在2000下默認是沒有的,當加載失敗的時候,程序可能就會有問題了。

一種解決方案是:在程序的安裝包裏帶上程序依賴的dll,但是這樣會帶來安裝包的增大。

另一種解決方案是:如果你能允許失去一些該dll提供的api時,那麼可以考慮下面介紹的方案。

(1)去掉 #param comment (lib, "xxx.lib")

(2)封裝API

        假設你使用了 void ApiFunc1();那麼你自己提供一個void ApiFunc1();函數

        該函數的實現如下:

         void ApiFunc1()

         {

                     LoadLibrary("xxx.dll");

                     如果加載失敗,或直接返回或自己實現一個簡化的版本;

                     如果加載成功,那麼調用真正的api

         }

(3)開發工具提供的一些經過封裝的類提供的一些方法是直接調用api的,我們也更改這種方式。但是這些經過封裝的類大多在include目錄裏,這個目錄裏的文件我們不能隨便更改,那麼怎麼辦呢?我們還是只需要按照2的方法來做即可。編譯器在鏈接api時,由於發現我們程序裏就有這個函數的實現,它就把我們自己的程序鏈接進去了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章