日期:2014-05-17 浏览次数:21220 次
[DllImport("StaticDll.dll", CharSet = CharSet.Ansi, EntryPoint = "CreateDlgEx", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static extern int CreateDlgEx(int na); [DllImport("StaticDll.dll", CharSet = CharSet.Ansi, EntryPoint = "AcceptDataEx", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static extern int AcceptDataEx(byte[] sBuf, int nLen, int nType);
[DllImport("user32")] public static extern int EnumWindows(CallBack x, int y); 3.最后实例化委托,调用 EnumWindows。 CallBack myCallBack = new CallBack(EnumWindowsApp.Report); 4.完全代码如下: using System; using System.Runtime.InteropServices; public delegate bool CallBack(int hwnd, int lParam); public class EnumWindowsApp { [DllImport("user32")] public static extern int EnumWindows(CallBack x, int y); public static void Main() { CallBack myCallBack = new CallBack(EnumWindowsApp.Report); EnumWindows(myCallBack, 0); } public static bool Report(int hwnd, int lParam) { Console.Write("Window handle is :"); Console.WriteLine(hwnd); return true; } }
------解决方案--------------------
回调函数是托管应用程序中可帮助非托管 DLL 函数完成任务的代码。对回调函数的调用将从托管应用程序中,通过一个 DLL 函数,间接地传递给托管实现。在用平台调用调用的多种 DLL 函数中,有些函数要求正确地运行托管代码中的回调函数。
开始实现之前,先查看 EnumWindows 函数的签名。EnumWindows 具有以下签名:
复制代码
BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
表示此函数需要回调的线索之一是存在 lpEnumFunc 参数。如果参数采用指向回调函数的指针,其名称中通常会有 lp(长指针)前缀与 Func 后缀的组合。有关 Win32 函数的文档,请参见 Microsoft Platform SDK。
创建托管回调函数。该示例声明一个名为 CallBack 的委托类型,此委托类型采用两个参数:hwnd 和 lparam。第一个参数是窗口的句柄;第二个参数由应用程序定义。在此版本中,这两个参数都必须是整数。
回调函数通常会返回非零值来表示成功,返回零来表示失败。本示例将返回值显式设置为 true,以继续进行枚举。
创建一个委托,并将其作为参数传递给 EnumWindows 函数。平台调用会自动将委托转换为常见的回调格式。