.NET 回调函数

原创 2004年07月20日 11:37:00

[文章来源:.NET SDK文档]

回调函数是托管应用程序中可帮助非托管 DLL 函数完成任务的代码。对回调函数的调用将从托管应用程序中,通过一个 DLL 函数,间接地传递给托管实现。在用平台调用调用的多种 DLL 函数中,有些函数要求正确地运行托管代码中的回调函数。本主题将介绍托管函数的元素,并说明如何实现回调函数和从托管代码中调用回调函数。

回调函数基础


要从托管代码中调用大多数 DLL 函数,可创建该函数的托管定义,然后调用该函数。此过程比较直接。
要使用需要回调函数的 DLL 函数,则会有一些附加的步骤。首先,必须在文档中查阅该函数,确定该函数是否需要回调。接着,必须在托管应用程序中创建回调函数。最后,调用该 DLL 函数,并将指向回调函数的指针当作参数进行传递。下图总结了这些步骤。

回调函数和实现

回调函数非常适合在重复执行任务的情况下使用。另一个常见用途是与枚举函数(如 Win32 API 中的 EnumFontFamilies、EnumPrinters 和 EnumWindows)一起使用。如下一节中的示例所示,EnumWindows 函数将枚举计算机上的所有现有窗口,并调用回调函数来对每个窗口执行一项任务。
实现回调函数
以下过程将说明托管应用程序如何使用平台调用来输出本地计算机上每个窗口的句柄值。尤其是,示例将使用 EnumWindows 函数来逐步浏览窗口列表,并使用一个托管回调函数(名为 CallBack)来输出窗口句柄的值。
实现回调函数
开始实现之前,先查看 EnumWindows 函数的签名。EnumWindows 具有以下签名:
BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
表示此函数需要回调的线索之一是存在 lpEnumFunc 参数。如果参数采用指向回调函数的指针,其名称中通常会有 lp(长指针)前缀与 Func 后缀的组合。有关 Win32 函数的文档,请参见 Microsoft Platform SDK。
创建托管回调函数。该示例声明一个名为 CallBack 的委托类型,此委托类型采用两个参数:hwnd 和 lparam。第一个参数是窗口的句柄;第二个参数由应用程序定义。在此版本中,这两个参数都必须是整数。
回调函数通常会返回非零值来表示成功,返回零来表示失败。本示例将返回值显式设置为 true,以继续进行枚举。
创建一个委托,并将其作为参数传递给 EnumWindows 函数。平台调用会自动将委托转换为常见的回调格式。
确保在回调函数完成其工作之前,垃圾回收器不会回收委托。如果委托作为参数进行传递,或者所包含的委托作为结构中的字段进行传递,则该委托在调用期间不会被回收。因此,正如下面的枚举示例所示,回调函数会在调用返回前完成其工作,而无需托管调用方执行额外的操作。
然而,如果可以在调用返回后调用回调函数,则托管调用方必须采取相应的措施来确保委托在回调函数完成其工作之前不会被回收。有关防止垃圾回收的详细信息,请参见用平台调用进行 Interop 封送处理。
示例
[Visual Basic]
Imports System
Imports System.Runtime.InteropServices

Public Delegate Function CallBack( _
hwnd As Integer, lParam As Integer) As Boolean

Public Class EnumReportApp

    Declare Function EnumWindows Lib "user32" ( _
       x As CallBack, y As Integer) As Integer

    Public Shared Sub Main()
        EnumWindows(AddressOf EnumReportApp.Report, 0)
    End Sub 'Main

    Public Shared Function Report(hwnd As Integer, lParam As Integer) _
    As Boolean
        Console.Write("Window handle is ")
        Console.WriteLine(hwnd)
        Return True
    End Function 'Report
End Class 'EnumReportApp
[C#]
using System;
using System.Runtime.InteropServices;

public delegate bool CallBack(int hwnd, int lParam);

public class EnumReportApp {

    [DllImport("user32")]
    public static extern int EnumWindows(CallBack x, int y);

    public static void Main()
    {
        CallBack myCallBack = new CallBack(EnumReportApp.Report);
        EnumWindows(myCallBack, 0);
    }

   public static bool Report(int hwnd, int lParam) {
        Console.Write("Window handle is ");
        Console.WriteLine(hwnd);
        return true;
    }
}

开启服务的命令-Net start命令详解

开启服务的命令-Net start命令详解  开启服务窗口的命令:开始-运行-cmd-services.msc 本文主要讲开启服务的命令: net start [服务名] -枚举开启的服务(...
  • haiross
  • haiross
  • 2013年10月22日 17:09
  • 16330

.NET为什么被叫做.NET

微软最初是在上世纪九十年代末开始开发.NET,最初.NET还不是叫做.NET,而是“Next Generation Windows Services” (NGWS)。那微软又为什么给它改名叫做.NET...
  • li0531
  • li0531
  • 2013年05月03日 11:37
  • 504

NET[NET基础知识]

1、.NET是什么?          .Net全称.NET Framework是一个开发和运行环境,         该战略是微软的一项全新创意,          它将使得“互联网行业进入一个...
  • u012099645
  • u012099645
  • 2013年10月30日 23:21
  • 669

.NET应用程序调试—原理、工具、方法

阅读目录: 1.背景介绍2.基本原理(Windows调试工具箱、.NET调试扩展SOS.DLL、SOSEX.DLL) 2.1.Windows调试工具箱2.2..NET调试扩展包,SOS.D...
  • wangqingpei557
  • wangqingpei557
  • 2014年10月15日 22:04
  • 4518

.net产生随机数(转)

在.net Framework中提供了一个专门用来产生随机数的类System.Random,使用这个类时必须导入System命名空间。当然,命名空间System在每个ASP.net页面中都是自动导入的...
  • junboyboy
  • junboyboy
  • 2014年03月02日 13:46
  • 2073

什么是.NET平台

1、  .NET 是Microsoft XML Web services 平台。XML Web services 允许应用程序通过 Internet进行通讯和共享数据,而不管所采用的是哪种操作系统、设...
  • u010168160
  • u010168160
  • 2014年05月25日 22:19
  • 5126

为什么 .NET 会被叫做 .NET?

为什么 .NET 会被叫做 .NET?   微软开发.NET Framework是在20世纪90年代后期,最初是叫做“下一代Windows服务”(Next Generation Win...
  • vbloveshllm
  • vbloveshllm
  • 2013年02月07日 18:40
  • 309

.Net基本语法学习(1)

.Net基本语法学习(1)
  • persistentA
  • persistentA
  • 2016年07月14日 23:14
  • 394

.NET 中的绝对路径和相对路径

在做网页时老是遇到什么“相对路径”“绝对路径”,听起来好像很熟悉的样子,可真正操作起来就郁闷,今天就在这里做个小小的总结。 1、绝对路径     绝对路径是指文件在硬盘上真正存在的路径。例...
  • ghxbob
  • ghxbob
  • 2014年04月19日 11:40
  • 1584

京东在用 .NET 吗?

很多人在讨论 .net 的时候,都会拿出京东做例子。支持者说京东能用 .net,说明 .net 很好,只要用得好,可以做大型网站。反对者说京东早期是用 .net 的,但是网站做得很烂,完全不能支撑业务...
  • closurer
  • closurer
  • 2017年05月04日 18:13
  • 1092
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.NET 回调函数
举报原因:
原因补充:

(最多只允许输入30个字)