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

Traduzione articoli Traduzione articoli
Identificativo articolo: 131313 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

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.H

extern "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

ProprietÓ

Identificativo articolo: 131313 - Ultima modifica: martedý 29 giugno 2004 - Revisione: 2.1
Le informazioni in questo articolo si applicano a:
  • The Microsoft Library Manager (LIB.EXE)áalle seguenti piattaforme
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 5.0 Standard Edition
Chiavi:á
kbmt kb3rdparty kbcode kbhowto KB131313 KbMtit
Traduzione automatica articoli
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
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.
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.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com