2011-09-13 14 views
5

Tengo algunas funciones de propósito general que se definen en mi archivo exe como Log(char* str). Esta función toma una cadena como una entrada de la persona que llama y la escribe en el archivo de registro definido para esa aplicación. Ahora quiero escribir el código DLL que incluirá una función para subir un archivo a un servidor.¿Cómo llamar a una función definida en mi exe dentro de mi DLL?

El objetivo es importar la función de carga de la DLL al exe y usarla. Sin embargo, si se encuentra algún error, la función de carga debe llamar a la función Log(char* str) para escribir el error en el archivo de registro.

El problema es que esta DLL necesita ser utilizada en múltiples aplicaciones y cada aplicación tendrá un archivo de registro diferente en una ubicación diferente. Quiero escribir el archivo DLL de tal manera que llame al Log(char* str) correspondiente definido en la aplicación. De manera similar, tengo algunas otras funciones que son específicas de la aplicación y no pueden incluirse en la DLL de antemano.

¿Cómo puedo escribir ese código DLL donde solo conoce el prototipo de la función, pero no la definición de función, que reside dentro del exe?

+2

'Log (char const * str) ', ¿seguro? –

+0

Escribir archivos fuente en varios idiomas es un trabajo duro. Te sugiero que te apegues a un idioma, a menos que lo estés haciendo por diversión. – pmg

+2

o 'Log (const char * str)'? – trojanfoe

Respuesta

8

Tiene una función en su DLL que el .exe puede llamar, pasando un puntero de función a su función Log. Dentro de la DLL, almacena ese puntero de función y úsalo cuando necesites iniciar sesión.

Si hay más de una función de este tipo que necesita pasar a su DLL, considere usar un struct para almacenar todos los punteros de funciones relevantes.

Aquí hay un buen tutorial sobre los punteros de función: The function pointer tutorial

mantener esta interfaz simple, yo recomendaría altamente mantener todas estas funciones "adaptables" en la llanura C, al menos como punto de partida. El tratamiento de las funciones de puntero a miembro y el paso de los objetos C++ alrededor de C es propenso a errores. (Pero factible.) O quedarse con C++ todo.

Aquí hay un pequeño ejemplo. En un encabezado común, coloque algo como esto:

typedef void (*logfunc)(char const*); 

para simplificar el paso del puntero de función personalizada.

En su código DLL, podría entonces tener:

logfunc cust_log; 

void dll_init_logging(logfunc l) 
{ 
    cust_log = l; 
} 

void dll_do_something() 
{ 
    cust_log("hello"); 
} 

modificar ese hacer estas funciones exportables si es necesario en su plataforma.

Luego de su código principal, todo lo que tiene que hacer (suponiendo que está cargando el archivo DLL y haciendo las funciones exportadas disponibles para su .exe con su nombre original) es:

void logit(char const* str) 
{ 
    printf("Log: %s\n", str); 
} 

int main (int argc, char const *argv[]) 
{ 
    // load the DLL 
    dll_init_logging(logit); 
    ... 
    dll_do_something(); 
    ... 
    return 0; 
} 
+0

Muchas gracias. Me dio una idea, sin embargo, no estoy 100% seguro de cómo implementarlo en C. ** "Tenga una función en su DLL que el .exe pueda invocar, pasando un puntero de función a su función de registro. almacena ese puntero de función y úsalo cuando necesites registrar cosas."** Podría u PLZ escribir un fragmento de código para una mejor comprensión – Shanty

+0

@Shanty:. Agrega un código de ejemplo probablemente no funcione como está con la vinculación dinámica - depende de su plataforma, sino que obtendrá la idea (funciona igual. . Si bien compilado estáticamente) – Mat

+0

@ Mat:. muchas gracias esto resolvió mi problema – Shanty

Cuestiones relacionadas