Organizzazione delle funzioni collegate DLL

4

Questa è una domanda sull'organizzazione del codice.

Ho ottenuto il mio codice base funzionante ma quando lo espanderò, sarà terribile. Ho una DLL che non ho un .lib per. Pertanto devo utilizzare l'intera% com_de% combo. Funziona alla grande. Ma questa DLL a cui sto facendo riferimento ha oltre 100 funzioni. Il mio processo attuale è:

1) Digitare un tipo per la funzione. E.g .: LoadLibrary()/GetProcAddress()

2) Assegna un nome di funzione che voglio usare come typedef short(_stdcall *type1)(void);

3) Carica la DLL, poi fai qualcosa come: type1 function_1;

Normalmente mi piacerebbe fare tutte le definizioni delle mie funzioni in un file di intestazione, ma poiché devo usare la funzione di libreria di caricamento, non è così facile. Il codice sarà un disastro. In questo momento sto facendo (1) e (2) in un file di intestazione e stavo considerando di fare una funzione in un altro file .cpp per fare la libreria di caricamento e scaricare tutti i (3) in là. Ho preso in considerazione l'utilizzo di uno spazio dei nomi per le funzioni in modo da poterli utilizzare nella funzione principale e non dover passare all'altra funzione.

Altri suggerimenti su come organizzare questo codice? I miei obiettivi devono essere in grado di utilizzare function_1 = (type1)GetProcAddress(hinstLib, "_mangled_funcName@5"); come una funzione regolare nel codice principale. Se devo un function_1 andrebbe bene, ma preferirei evitarlo. Questo codice per tutti gli scopi pratici è semplicemente C al momento.

    
posta m25 09.06.2014 - 17:24
fonte

3 risposte

2

Puoi provare a generare il file .lib da .dll: link

Dopo che l'attività è molto più semplice e pulita - per creare un'intestazione con le dichiarazioni di funzione. Questo può essere fatto manualmente o (semi-) automatizzato.

    
risposta data 11.06.2014 - 10:44
fonte
1

Crea un meta formato compatto (AKA a DSL ) per descrivere le firme di funzioni e scrivere un generatore di codice che legge quel meta-formato e produce tutti gli header e i file cpp necessari per il codice loadLibrary. Quindi non devi preoccuparti troppo della leggibilità del codice C o C ++, ma assicurati che il tuo meta-formato sia ben leggibile.

    
risposta data 09.06.2014 - 18:49
fonte
0

Uno script di generatore di codice sarebbe una soluzione molto accurata, dovresti investigare.

Se vuoi attaccare solo a C, probabilmente puoi pulire un po 'il codice usando un paio di macro. Forse uno per dichiarare il typedef e la variabile in un colpo solo, in questo modo:

#define FUNC_DECL(retType, name, param)\
     typedef retType (_stdcall * name##_f)(param);\
     name##_f name;

E uno per inizializzare la variabile in modo più pulito:

#define FUNC_LOAD(name, lib)\
     name = (name##_f)GetProcAddress(lib);

Quindi ora dovresti solo aggiungere un FUNC_DECL(function_X) nello scope globale di un file C. e chiama FUNC_LOAD(function_X, lib) in alcune funzioni di inizializzazione. Dovresti comunque dichiarare un'istruzione extern in un file di intestazione, tuttavia, se function_X deve essere visibile altrove. E.g .: extern function_X_f function_X;

    
risposta data 09.06.2014 - 21:59
fonte

Leggi altre domande sui tag