2011-12-02 64 views
6

我有一個奇怪的問題。我有兩個DLL,我們稱它們爲DLL-A和DLL-B。功能從一個DLL調用另一個DLL的同名功能

DLL-A有一個名爲f1()的函數,DLL-B也具有同名函數f1()。現在在DLL-A中,f1()像這樣調用DLL-B的f1()

DLL-A

f1() 
{ 
    f1(); //this is DLL-B function, but having the same name 
} 

現在我的問題是,會不會是f1()從DLL-A遞歸調用?

回答

3

他們這樣寫你的方式f1在f1內不會調用DLL-B而是無限遞歸。如果你想調用DLL-B功能,你將不得不使用GetProcAddress的

7

f1()的函數體內調用自身,導致無限遞歸,因爲你嫌。一些可能的解決方案:

  • 將導入的DLL函數放在一個單獨的名稱空間中,以便您可以區分它的名稱。
  • 更改這些函數的名稱以避免衝突。
  • 進口明確而不是隱含使用GetProcAddress。這允許你調用任何你喜歡的導入函數。
+1

+1。 –

2

如果鏈接導出相同符號的兩個對象文件,則應該會出現編譯器或鏈接器錯誤。就像「符號f1()的多重定義」。

也就是說,如果您在一個dll中包含聲明其他函數或將兩個二進制文件鏈接在一起的頭文件。

要解決此問題,請將函數置於命名空間中。

5

您可以將DLL-A中函數的名稱更改爲A_f1

A_f1() 
{ 
    f1() //this calls DLL-B's f1 
} 

在你DEF文件,寫

EXPORTS 
    f1 = A_f1 

這說:「我在內部調用A_f1該函數應名f1下出口到其他組件。」這樣,每個使用DLL-A並調用f1(期望獲得函數A)的人都會得到A_f1

我假設重命名導出的函數是不可能的。如果有可能,那麼這是一個更清潔的解決方案。 (我的猜測是,這是不可能的,因爲你正在試圖破解視頻遊戲。)

+0

關於黑客入侵視頻遊戲的好評 – Gabrielius