Al momento sei offline in attesa che la connessione Internet venga ristabilita

Creazione di librerie di importazione di 32 bit senza .OBJs o origine

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 131313
Dichiarazione di non responsabilità per articoli della Microsoft Knowledge Base su prodotti non più supportati
Questo articolo è stato scritto sui prodotti per cui Microsoft non offre più supporto. L’articolo, quindi, viene offerto ‘così come è’ e non verrà più aggiornato.
Sommario
In questo articolo viene descritto come creare una libreria di importazione specificata di una DLL per il quale non si dispone moduli di codice o l'oggetto di origine. Si è verificato con le versioni di 16 bit di Visual c ++ non è non utilità che può creare una libreria di importazione da una DLL a 32 bit.

Nota : questo metodo potrebbe non funzionare con DLL generate con strumenti di sviluppo non Microsoft.
Informazioni
In genere, quando crea una DLL o da qualsiasi destinazione che esporta funzioni o elementi di dati, una libreria di importazione (e il file di esportazione) viene generato durante il processo di collegamento. Ma nel caso di una DLL di terze parti non viene fornito con una libreria di importazione, potrebbe essere necessario generare una libreria di importazione per poter utilizzare la DLL correttamente utilizzando il collegamento dinamico in fase di carico. Una libreria di importazione non è necessario per il collegamento dinamico in fase di esecuzione.

Esistono due metodi per la creazione una libreria di importazione specificata di una DLL:
  • Creare un file DEF per l'utilizzo di /DEF LIB: comando.
  • Stub funzioni e utilizzare i file obj creati per simulare le relazioni di importazione/esportazione. Utilizzare quindi il /DEF LIB: comando per creare la libreria di importazione.

Creazione di un file DEF

L'unico caso in cui è possibile utilizzare un file DEF per creare una libreria di importazione da una DLL per il quale non si dispone del codice sorgente o moduli di oggetto è se la DLL esporta funzioni tramite un'interfaccia C. In particolare, le funzioni devono dichiarato per utilizzare la convenzione di chiamata C. Viene specificato dall'attributo _cdecl, in genere utilizzata il prototipo della funzione. Si noti che se non è specificato alcun attributo, _cdecl è il valore predefinito quando /GZ (_stdcall è l'impostazione predefinita) o /GR (_fastcall è l'impostazione predefinita) sulla riga di comando CL non viene specificato. Il motivo di questa limitazione si basa su un presupposto apportato dall'utilità LIB che tutti i nomi vengono esportati automaticamente senza un carattere di sottolineatura iniziali. Questo vale solo per i nomi di funzione _cdecl.

Specificata una DLL con le funzioni esportate tramite un'interfaccia C, è possibile creare una libreria di importazione attenendosi alla seguente procedura:
  1. Utilizzare DUMPBIN /EXPORTS < nome file dll > per ottenere l'elenco dei simboli esportati per la DLL in questione. I simboli visualizzati nella colonna "nome" della tabella, le intestazioni di cui sono "nome ordinale hint".
  2. Creare un file def che contiene una sezione EXPORTS con i nomi delle funzioni elencate nella colonna "nome" dell'output di DUMPBIN.
  3. Per le funzioni di _cdecl, il simbolo viene visualizzato come quando utilizzato in al programma chiamante. Inserire solo il simbolo presente nella sezione EXPORTS del file DEF.
  4. Utilizzare LIB /DEF: < nome file def > per generare il file di libreria ed esportazioni di importazione. Il nome di base della libreria di importazione sarà il nome di base del file DEF. Utilizzare/OUT: per controllare il nome della libreria di output.

Venivano funzioni

Per le funzioni esportate che utilizzano convenzioni di chiamata diversa da C, la situazione è un po' più complessa. Questo è particolarmente vero se si considera le funzioni di c ++ e le combinazioni di decorazione del nome complesse coinvolti. Per utilizzare questo metodo, è necessario almeno il file di intestazione che descrive interfaccia della DLL.

Per creare prototipi di funzioni da prototipi in un file di intestazione:
  1. Quando si utilizza "__declspec (dllimport)" in una dichiarazione o prototipo, modificarlo in "__declspec (dllexport)".
  2. Per le funzioni che non restituiscono un valore, per le funzioni C d ' origine c e per le funzioni C nel codice di origine c ++ (utilizzato con il costrutto "extern"C""), sostituire il punto e virgola che termina il prototipo di funzione con una coppia corrispondente delle parentesi graffe ("{}").
  3. Per le funzioni c ++ (globale o membro) che restituiscono un valore, è necessario creare un corpo fittizio per la funzione e restituire un valore fittizio di tipo appropriato. (Non con un'istruzione return della funzione non valido.) Questo vale per le funzioni membro delle classi, nonché. Tenere presente che lo scopo di questa procedura è quello di ingannare l'utilità LIB nel generare la libreria di importazione corretto, in modo che questi enti fittizi avranno effetto.
  4. Per le classi c ++, è possibile stub funzioni membro utilizzando la dichiarazione di classe i prototipi, purché si disattiva l'inline di funzione quando si compila.
  5. Gli argomenti della funzione sono in genere solo specificati da tipo in un file di intestazione. Ad esempio, Geta(int). Quando si aggiunge il corpo della funzione fittizio Geta(int x) è necessario specificare un identificatore di argomento fittizio. In caso contrario l'errore C2055 generata.

Esempio

Se il file di intestazione che descrive il MYDLL.DLL appare come:
// mydll.Hextern "C" __declspec(dllimport) void _stdcall Function(void);class __declspec(dllimport) CMyClass {     int a;     long b;public:     int Geta(int);     long Getb();     CMyClass();};				
dovrebbe essere simile il file di origine fittizio che consente di generare la libreria di importazione:
 // mydll.CPP extern "C" __declspec(dllexport) void _stdcall Function(void) {} class __declspec(dllexport) CMyClass {      int a;      long b; public:      int Geta(int x) {return 111;}      long Getb() {return 111;}      CMyClass() {} };				
dopo le funzioni sono stubbed, è sufficiente è compilare il file di origine in un file obj:
CL /c /Ob0 mydll.CPP
Nota: Disattivazione l'inline di funzione è necessario per forzare la generazione di simboli per le funzioni definite in CMyClass. Se venisse attivato l'inline di funzione, il compilatore si si noti che non sono riferimenti alle funzioni membro nell'unità di conversione, in modo che potrebbe ignorare il corpo della funzione. Vedere la discussione in espansione delle funzioni inline in ottimizzazioni nel riferimento di riga di comando di CL Visual c ++.

Una volta che si dispone di file obj, è possibile utilizzare LIB /DEF: per creare la libreria di importazione (lib) e il file di esportazione (EXP):
LIB /DEF: mydll.OBJ
Per ulteriori informazioni sul comando LIB, consultare la "Guida di LIB" Visual c ++ documentazione in linea di.

In proposito vedere anche il seguente articolo della Knowledge Base:
140485Esportazione di simboli simili di PASCAL in DLL a 32 bit
2.50 2.55 COLLEGAMENTO /LIB

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 131313 - Ultima revisione: 06/29/2004 23:25:41 - Revisione: 2.1

The Microsoft Library Manager (LIB.EXE)

  • kbmt kb3rdparty kbcode kbhowto KB131313 KbMtit
Feedback
'meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">