Esempio di tecnologia di richiamo piattaforma
Aggiornamento: novembre 2007
In questo esempio vengono illustrate le tecniche utilizzate per chiamare le funzioni esportate da una libreria non gestita. In particolare viene illustrato come:
Dichiarare tipi diversi
Utilizzare gli attributi disponibili per modificare il comportamento predefinito
Utilizzare i metodi del tipo Marshal
Determinare gli aspetti della Garbage Collection e del modello di threading che possono influire sui risultati.
In alcuni esempi vengono utilizzate funzioni esportate da librerie Windows mentre in altri vengono utilizzate funzioni esportate da una libreria personalizzata. È possibile che le librerie utilizzate in alcuni esempi non siano disponibili su tutte le piattaforme Windows o che le funzioni non siano supportate in tutte le piattaforme Windows. Questo problema, comunque, non impedirà di comprendere le specifiche regole di richiamo piattaforma utilizzate in un esempio.
Di seguito è indicata la struttura di directory utilizzata negli esempi.
Directory |
Contenuto |
---|---|
WinAPIs |
Dimostrazione della tecnologia di richiamo piattaforma mediante l'utilizzo di funzioni esportate da librerie Windows. |
WinAPIs\CS |
File di origine scritti in C#. |
WinAPIs\VB |
File di origine scritti in Visual Basic. |
Personalizzato |
Dimostrazione della tecnologia di richiamo piattaforma mediante l'utilizzo di funzioni esportate da una libreria dei tipi personalizzata. |
Custom\CS |
File di origine scritti in C#. |
Custom\LIB |
File di origine della libreria dei tipi personalizzata. |
Custom\VB |
File di origine scritti in VB. |
Per informazioni sull'utilizzo degli esempi, vedere i seguenti argomenti:
Per compilare gli esempi utilizzando il prompt dei comandi
Aprire una finestra del prompt dei comandi, quindi spostarsi in una delle sottodirectory specifiche del linguaggio.
Digitare msbuild [nome file].sln dalla riga di comando.
Nota: Gli esempi di richiamo piattaforma mediante funzioni di una libreria dei tipi personalizzata possono essere compilati soltanto utilizzando Visual Studio.
Per compilare gli esempi utilizzando Visual Studio
Aprire Esplora risorse, quindi spostarsi in una delle sottodirectory specifiche del linguaggio.
Fare doppio clic sull'icona relativa a [nome file].sln per aprire il file in Visual Studio.
Scegliere Compila soluzione dal menu Compila.
Per eseguire gli esempi
Spostarsi in una delle directory specifiche del linguaggio della directory WinAPIs o Custom contenente gli eseguibili compilati.
Digitare il nome del file eseguibile dalla riga di comando.
Nota: L'esempio compila applicazioni console. Per visualizzare l'output delle applicazioni, è necessario avviarle separatamente dalla finestra del prompt dei comandi.
Requisiti
Per questi esempi sono necessari i file di intestazione di Windows, che sono disponibili per il progetto se questo viene compilato mediante Microsoft Visual Studio 2005 o il prompt dei comandi di Visual Studio 2005 oppure se Platform SDK è installato e specificato in un percorso di inclusione.
Osservazioni
Nelle tabelle riportate di seguito viene fornita una breve descrizione degli argomenti illustrati negli esempi e sono elencati i percorsi dei file di origine degli esempi relativi all'argomento specifico.
Utilizzo degli attributi di richiamo piattaforma
Attributo |
Descrizione |
Esempio |
---|---|---|
EntryPoint |
Rinomina una funzione da utilizzare in codice gestito. |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
CharSet |
Specifica come eseguire il marshalling delle stringhe e influisce sui criteri di ricerca dei nomi di funzione. |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
ExactSpelling |
Indica se il nome del punto di ingresso nella DLL non gestita deve essere modificato in modo che corrisponda al valore di CharSet. |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
CallingConvention |
Chiama le funzioni con varargs. |
WinAPIs\CS\Printf.cs WinAPIs\VB\Printf.vb |
PreserveSig |
Modifica le funzioni che restituiscono i valori HRESULT. |
WinAPIs\CS\CreateObject.cs WinAPIs\VB\CreateObject.vb |
SetLastError |
Garantisce che il codice di errore venga salvato dopo una chiamata di funzione. |
WinAPIs\CS\Errors.cs WinAPIs\VB\Errors.vb |
Esecuzione del marshalling di strutture e unioni
Tipo |
Descrizione |
Esempio |
---|---|---|
Struttura ByVal |
Passa una struttura come parametro in. |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
Struttura ByRef |
Passa una struttura come parametro in/out. |
WinAPIs\CS\OSInfo.cs WinAPIs\VB\OSInfo.vb |
Classe ByVal |
Passa una classe contenente soltanto membri integer come parametro in/out. |
WinAPIs\CS\SysTime.cs WinAPIs\VB\SysTime.vb |
Struttura con strutture nidificate (semplificata) |
Genera una classe che rappresenta una struttura con strutture nidificate sul lato non gestito. La struttura viene semplificata in una struttura di grandi dimensioni sul lato gestito. |
WinAPIs\CS\FindFile.cs WinAPIs\VB\FindFile.vb |
Struttura con strutture nidificate (non semplificata) |
Passa una struttura con una struttura incorporata. |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
Struttura contenente un puntatore a un'altra struttura |
Passa una struttura che contiene un puntatore a un'altra struttura come membro. |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
Matrice di strutture contenenti soltanto valori integer ByVal |
Passa una matrice di strutture che contengono solo valori integer come parametro in/out. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
Matrice di strutture contenenti valori integer e stringhe ByRef |
Passa una matrice di strutture che contengono valori integer e stringhe come parametro out. La memoria per la matrice viene allocata dal chiamato. |
Custom\CS\OutArrayOfStructs.cs Custom\VB\OutArrayOfStructs.vb |
Unioni con tipi di valore |
Passa un'unione con tipi di valore (integer e double). |
Custom\CS\Unions.cs Custom\VB\Unions.vb |
Unioni con tipi misti |
Passa un'unione con tipi misti (integer e string). |
Custom\CS\Unions.cs Custom\VB\Unions.vb |
Esecuzione del marshalling di matrici
Matrice |
Descrizione |
Esempio |
---|---|---|
Matrice di valori integer ByVal |
Passa una matrice di valori integer come parametro in/out. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
Matrice di valori integer ByRef |
Passa una matrice di valori integer come parametro in/out. La matrice può essere ridimensionata. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
Matrice bidimensionale di valori integer ByVal |
Passa una matrice bidimensionale di integer come parametro in/out. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
Varie
Tipo di elemento |
Descrizione |
Esempio |
---|---|---|
HandleRef |
Viene presentato un caso in cui è necessario utilizzare HandleRef per impedire l'esecuzione della Garbage Collection. |
WinAPIs\CS\HandleRef.cs WinAPIs\VB\HandleRef.vb |
Puntatori a funzione |
Passano un delegato a una funzione non gestita per la quale è previsto un puntatore a funzione. |
Custom\CS\Callback.cs Custom\VB\Callback.vb |
void* |
Chiama una funzione il cui parametro è void*. |
Custom\CS\Void.cs Custom\VB\Void.vb |
LPARAM |
Utilizza GCHandle per passare un oggetto gestito a una funzione non gestita che prevede LPARAM. |
WinAPIs\CS\GCHandle.cs WinAPIs\VB\GCHandle.vb |
Apartment a thread singolo (STA)/Apartment con multithreading (MTA) |
Modifica le impostazioni di apartment predefinite quando una funzione non gestita chiama CoInitialize. |
WinAPIs\CS\ActiveDir.cs WinAPIs\VB\ActiveDir.vb |
Per ulteriori informazioni sul richiamo piattaforma, vedere i commenti nei file di codice sorgente.
Vedere anche
Concetti
Utilizzo di funzioni di DLL non gestite
Esempi di richiamo piattaforma