2011-09-13 8 views
5

Ho alcune funzioni generiche definite nel mio file exe come Log(char* str). Questa funzione accetta una stringa come input dal chiamante e la scrive nel file di log definito per quella applicazione. Ora voglio scrivere il codice DLL che includerà una funzione per caricare un file su un server.Come chiamare una funzione definita nel mio exe nella mia DLL?

L'obiettivo è importare la funzione di caricamento dalla DLL nell'exe e utilizzarla. Tuttavia, se si verifica un errore, la funzione di caricamento deve chiamare la funzione Log(char* str) per scrivere l'errore nel file di registro.

Il problema è che questa DLL deve essere utilizzata in più applicazioni e ciascuna applicazione avrà un file di registro diverso in una posizione diversa. Voglio scrivere la DLL in modo tale che chiami il corrispondente Log(char* str) definito nell'applicazione. Allo stesso modo ho alcune altre funzioni che sono specifiche dell'applicazione e non possono essere incluse nella DLL in anticipo.

Come posso scrivere un codice DLL in cui conosce solo la funzione prototipo, ma non la definizione della funzione, che risiede all'interno dell'exe?

+2

'Log (char const * str) ', sicuramente? –

+0

Scrivere file sorgente multilingue è un compito arduo. Ti suggerisco di attenersi a una lingua, a meno che tu non lo stia facendo per divertimento. – pmg

+2

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

risposta

8

Avere una funzione nella DLL che l'exe può chiamare, passando un puntatore alla funzione Log. All'interno della DLL, memorizza il puntatore a questa funzione e usalo quando devi registrare le cose.

Se è presente più di una di queste funzioni, è necessario passare alla DLL, considerare l'utilizzo di struct per memorizzare tutti i puntatori di funzione pertinenti.

Ecco un buon tutorial su puntatori a funzione: The function pointer tutorial

Per mantenere questa interfaccia semplice, mi raccomando mantenendo tutte queste funzioni "personalizzabili" in pianura C, almeno come punto di partenza. Trattare con le funzioni da puntatore a membro e passare gli oggetti C++ attorno ai wrapper C è soggetto a errori. (Ma fattibile.) O bastone con C++ a tutto tondo.

Ecco un breve esempio. In un'intestazione comune, inserire qualcosa come:

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

per semplificare il passaggio attorno al puntatore funzione personalizzato.

Nel codice DLL, si potrebbe quindi avere:

logfunc cust_log; 

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

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

modificare tale per rendere queste funzioni esportabile, se necessario, sulla propria piattaforma.

Poi dal codice principale, tutto quello che dovete fare (supponendo che si sta caricando la DLL e rendendo le funzioni esportate disponibili per il file exe con il loro nome originale) è:

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

Thnks molto. Mi ha dato qualche idea, tuttavia non sono sicuro al 100% come implementarlo in C. ** "Avere una funzione nella DLL che l'exe può chiamare, passando un puntatore alla funzione Log. All'interno della DLL, memorizza quel puntatore a funzione e usalo quando devi registrare le cose."** Potresti scrivere uno snippet di codice per una migliore comprensione – Shanty

+0

@Shanty: aggiunto qualche codice di esempio Probabilmente non funzionerà così com'è con il collegamento dinamico, dipende dalla tua piattaforma, ma ti verrà l'idea. (Funziona solo bene se compilato staticamente.) – Mat

+0

@ Mat: Grazie mille Questo ha risolto il mio problema – Shanty

Problemi correlati