2009-01-29 55 views
2

神奇有什麼差別:我應該使用GetProcAddress還是隻包含各種win32庫?

static PROCESSWALK pProcess32First=(PROCESSWALK)GetProcAddress(hKernel,"Process32First"); 
... 
pProcess32First(...); 

是什麼hKernel?看看here。你可以用GetModuleHandle()

#include <Tlhelp32.h> 
... 
Process32First(...); 

有什麼區別更換,我不知道我應該使用。那麼最佳實踐方面有什麼不同嗎?

回答

7

注:我的答案假定該功能可用,或者在非導出函數之後還有其他事情需要考慮。

如果使用LoadLibrary和GetProcAddress,那麼如果所需的庫不存在,則可以使用減少的功能運行該選項。如果你直接使用include和lib鏈接,並且dll不存在(或者由於版本錯誤導致沒有導出),你的應用程序將無法加載。

如果您想使用不是所有版本的給定dll的函數,它只會有所作爲。

2

有關Microsoft的解釋,請參閱here

隱式鏈接(使用*.lib)更簡單。

至於內核庫,沒有其他區別。

2

我會採取第一種方法,如果我有用戶可能或不可以有的可選插件庫。對於必要的庫,我會使用第二個庫,因爲獲取函數的代碼少得多。

2

除了Evan所說的(這是正確的),另一個重要的區別(恕我直言)是,如果你動態加載函數,你需要有一個typedef來投射void *來調用函數一旦它被加載。除非爲靜態鏈接定義函數原型的頭文件有一個機制,用於同樣定義來自相同模板函數定義代碼的函數指針的typedef,否則最終會出現重複函數定義,可能在您的代碼中。如果外部頭文件定義被更新(例如,用64位數據類型的新定義),除非更新其他函數原型(在編譯時不會捕獲這些原型,這是因爲c-樣式轉換爲函數typedef)。

這是一個微妙的問題,但需要重點考慮。如果因爲這個問題而可以使用隱式(「靜態」)鏈接,並且如果使用動態加載,請注意問題並構建代碼以儘可能避免將來出現問題。