2009-07-30 19 views
8

Prima di tutto, mi riferisco a un ambiente Windows e al compilatore VC++.Come aggiornare una DLL C++ senza dover ricollegare l'exe con il file lib?

Quello che voglio essere in grado di fare è ricostruire una DLL VC++ e mantenere la compatibilità con un exe che è già stato collegato alla lib senza dover ricostruire l'exe o caricare la DLL dinamicamente con LoadLibrary. In altre parole, c'è un modo per aggiungere classi e metodi a una dll (ma non rimuoverne nessuno) e garantire che gli entry point esistenti rimangano gli stessi?

risposta

8

Se si esportano le funzioni dall'uso di un file DEF e si specificano manualmente gli ordinali, si dovrebbe riuscire a farlo.

Riferimento

http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx

+5

Vorrei aggiungere il riferimento http: //msdn.microsoft.com/en-us/library/900axts6(VS.80).as px E 'solo un clic di distanza dal collegamento ipertestuale sopra e discute i motivi per l'utilizzo di file def e pro e contro. – Rich

0

Fintanto che non si aggiungono simboli esportati, gli ordinali non cambieranno. Se aggiungi simboli esportati tramite il meccanismo dllexport standard, sarà difficile controllarli. Se usi il vecchio file di simboli .xpf potresti essere in grado di controllare l'ordinamento dei simboli nella lib (anche se non lo so per certo - potrebbe ancora riordinarli come preferisce), ma è difficile da fare Simboli C++ in questo modo.

0

penso che ordinali sono raramente utilizzati per risolvere i più importazioni DLL - penso che si deve utilizzare i file DEF per ottenere il linker di usarli. Quindi, finché non si cambiano i nomi o le firme delle funzioni esportate, l'exe dovrebbe funzionare bene.

8

Dipende da come il tuo EXE ha usato le classi dalla DLL. L'aggiunta di nuove classi non dovrebbe influire sugli entry point esistenti. A parte ciò, tuttavia, quanto segue influisce sulla dimensione e/o sul layout degli oggetti e, in quanto tale, cambierà il client (si noti che questo è tecnicamente specifico per VC, ma la maggior parte di questi si applica a qualsiasi implementazione sana):

  • rimozione di campi (anche privato) dalle classi
  • L'aggiunta di nuovi campi (anche privato) per le classi
  • l'aggiunta di nuove classi base alle classi esistenti
  • Rimozione classi base da classi esistenti
  • Aggiunta nuova virtual metodo prima dello un metodo virtuale esistente (aggiungendo nuovi metodi virtuali dopo quelli esistenti va bene, eccetto per il caso descritto nel prossimo punto)
  • Aggiunta di un nuovo metodo virtuale in una classe che viene utilizzata come classe base da un'altra classe nella stessa DLL che ha anche metodi virtuali
  • Cambio tipo di campi esistenti
  • Modifica firma dei metodi esistenti
  • fanno un metodo virtuale non virtuale, e viceversa
+0

Penso che questa sia una buona risposta, ma cambierei una cosa: cambiare i metodi virtuali in una classe in qualsiasi modo sarebbe sospetto. Non penso che tu possa contare sul vtable per avere le funzioni virtuali nello stesso ordine mostrato nel file sorgente. –

+0

Almeno in VC, potete contare su questo - questo è un prerequisito per il supporto COM (che richiede un ordinamento Vtable definito). –

+0

Ottima risposta, Pavel, mi chiedo solo se potresti aggiungere dei riferimenti per supportare le tue affermazioni. Grazie! –

Problemi correlati