2011-12-02 20 views
6

Tengo un problema peculiar. Tengo dos DLL, llamémoslos DLL-A y DLL-B.funciona desde una llamada dll la misma función de nombre de otra dll

DLL-A tiene una función llamada f1() y DLL-B también tiene la función con el mismo nombre, f1(). Ahora en DLL-A, f1() está llamando f1() de DLL-B como este.

DLL-A:

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

Ahora mi pregunta es que, ¿será una llamada recursiva de f1() de DLL-A?

Respuesta

3

La forma en que lo han escrito f1 f1 dentro no va a llamar a DLL-B, pero ser un bucle infinito. Si desea llamar a la función DLL-B tendrá que utilizar GetProcAddress

7

El f1() en el interior del cuerpo de la función llama a sí misma dando lugar a un bucle infinito, como se sospechaba. Algunas soluciones posibles:

  • Ponga la función DLL importada en un espacio de nombres separado para que pueda distinguir su nombre.
  • Cambie los nombres de estas funciones para evitar un conflicto.
  • importación explícitamente en lugar de implícitamente mediante el uso de GetProcAddress. Eso le permite llamar a la función importada todo lo que quiera.
+1

+1 para GetProcAddress. –

2

Debe obtener un compilador o un error de enlazador si vincula dos archivos de objetos que exportan el mismo símbolo. Algo así como "definición múltiple para el símbolo f1()".

Eso es, por supuesto, si incluye en un dll el encabezado que declara la otra función o vincula los dos binarios.

Para resolver esto, coloque las funciones dentro de espacios de nombres.

5

Puede cambiar el nombre de la función en DLL-A a A_f1.

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

En su archivo DEF, escribir

EXPORTS 
    f1 = A_f1 

Esto dice "La función I llamado internamente A_f1 debe ser exportado bajo el nombre f1 a otros componentes." De esta forma, todos los que han estado usando DLL-A y llaman a f1 (esperando obtener la función A) recibirán A_f1.

Supongo que el cambio de nombre de las funciones exportadas no es posible. Si es posible, entonces esa es una solución mucho más limpia. (Mi conjetura es que no es posible debido a que está intentando cortar un videojuego.)

+0

Buen comentario sobre hackear un videojuego – Gabrielius

Cuestiones relacionadas