2011-12-02 19 views
6

Ho un problema particolare. Ho due DLL, chiamiamole DLL-A e DLL-B.funzione da una dll che chiama la stessa funzione di nome di un'altra DLL

DLL-A ha una funzione denominata f1() e DLL-B ha anche una funzione con lo stesso nome, f1(). Ora in DLL-A, f1() sta chiamando f1() di DLL-B come questo.

DLL-A:

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

Ora la mia domanda è che, sarà una chiamata ricorsiva di f1() da DLL-A?

risposta

3

Il modo in cui l'hai scritto f1 in f1 non chiamerà DLL-B ma sarà una ricorsione infinita. Se si desidera chiamare la funzione DLL-B si dovrà utilizzare GetProcAddress

7

Il f1() all'interno del corpo della funzione chiama se stessa che porta a una ricorsione infinita, come si sospetta. Alcune possibili soluzioni:

  • Inserire la funzione DLL importata in uno spazio dei nomi separato in modo da poterne distinguere il nome.
  • Modificare i nomi di queste funzioni per evitare uno scontro.
  • Import esplicitamente implicitamente utilizzando GetProcAddress. Ciò ti consente di chiamare la funzione importata tutto ciò che desideri.
+1

+1 per GetProcAddress. –

2

Si dovrebbe ottenere un errore del compilatore o del linker se si collegano due file di oggetti che esportano lo stesso simbolo. Qualcosa come "definizione multipla per il simbolo f1()".

Ovviamente, se si include in una DLL l'intestazione che dichiara l'altra funzione o collega i due file binari insieme.

Per risolvere questo problema, posizionare le funzioni all'interno dei namespace.

5

È possibile modificare il nome della funzione in DLL-A su A_f1.

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

Nel file DEF, scrivere

EXPORTS 
    f1 = A_f1 

Questo dice: "La funzione che internamente chiamato A_f1 deve essere esportato sotto il nome f1 ad altri componenti." In questo modo tutti coloro che avevano utilizzato DLL-A e chiamano f1 (aspettandosi di ottenere la funzione A) otterranno A_f1.

Suppongo che la ridenominazione delle funzioni esportate non sia possibile. Se è possibile, allora questa è una soluzione molto più pulita. (La mia ipotesi è che non è possibile perché si sta cercando di incidere un videogioco.)

+0

Bel commento sull'hacking di un videogioco – Gabrielius

Problemi correlati