Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Esempio di GCHandle

In questo esempio viene illustrato come passare un oggetto gestito a una funzione non gestita per la quale è previsto un tipo LPARAM. Il tipo LPARAM è un puntatore a un parametro non gestito.

Nell'esempio di GCHandle viene utilizzata la seguente funzione non gestita, illustrata con la dichiarazione di funzione originale:

  • EnumWindows esportata da User32.dll.

    BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam);
    

In questo esempio la classe LibWrap contiene un prototipo gestito del metodo EnumWindows. Come parametri, nel metodo gestito vengono sostituiti il delegato CallBack per il puntatore a funzione WNDENUMPROC e un puntatore IntPtr per il tipo LPARAM.

La classe App crea un handle per l'oggetto gestito mediante il metodo GCHandle.Alloc che consente di evitare che l'oggetto gestito sia sottoposto alla procedura di Garbage Collection. Con una chiamata al metodo EnumWindows il delegato e l'oggetto gestito vengono passati e viene effettuato il cast dell'handle su un puntatore IntPtr. La funzione non gestita restituisce il tipo al chiamante come parametro della funzione di callback.


public delegate bool CallBack(int handle, IntPtr param);

public class LibWrap
{
    // Passes a managed object as an LPARAM type.
    // Declares a managed prototype for the unmanaged function.
    [DllImport("user32.dll")]
    public static extern bool EnumWindows(CallBack cb, IntPtr param);
}



public class App
{
    public static void Main()
    {
        TextWriter tw = System.Console.Out;
        GCHandle gch = GCHandle.Alloc(tw);
        CallBack cewp = new CallBack(CaptureEnumWindowsProc);

        // Platform invoke prevents the delegate from being garbage
        // collected before the call ends.
        LibWrap.EnumWindows(cewp, (IntPtr)gch);
        gch.Free();
    }

    private static bool CaptureEnumWindowsProc(int handle, IntPtr param)
    {
        GCHandle gch = (GCHandle)param;
        TextWriter tw = (TextWriter)gch.Target;
        tw.WriteLine(handle);
        return true;
    }
}


Mostra: