none
专家这段代码如何运行的? RRS feed

  • 问题

  • 专家好:
    请问下面这段代码中的
      public delegate bool CallBack(int hwnd, int lParam);
    
    
    
          #region  dllimport
    
    
    
          [DllImport("user32")]
    
    
    
          public static extern int EnumWindows(CallBack cb, int y);
    
    
    
    
    
    
    
     private void button1_Click(object sender, EventArgs e)
    
    
    
            {
    
    
    
                try
    
    
    
                {
    
    
    
                    EnumWindows(this.Report, 0);
    
                }
    
    
    
                catch (Exception ex)
    
    
    
                {
    
    
    
                    MessageBox.Show(ex.Message);
    
    
    
                    throw;
    
    
    
                }
    
    
    
    
    
    
    
            }
    
    
    
            public bool   Report(int hwnd, int lParam)
    
    
    
            {
    
    
    
                try
    
    
    
                {
    
    
    
                                 this.listBox1.Items.Add(hwnd.ToString());
    
    
    
    
    
    
    
                    return true;
    
    
    
                }
    
    
    
                catch (Exception ex)
    
    
    
                {
    
    
    
                    MessageBox.Show(ex.Message);
    
    
    
                    throw;
    
    
    
                }<br/><br/>
    
    
    
    
    这段代码 使我从网上找来的, 我给改了一下 运行起来没有问题
    原来代码是这样的 
     // CallBack myCallBack = new CallBack(this.Report);
    
    
    
    
    
    
    
                    EnumWindows(myCallBack, 0);
    
    
    
    

    我现在有一点不太理解 就是  我改成这样  EnumWindows(this.Report, 0);
     为什么  能正常运行呢?
    这个代码顶部声明的委托 callback 是 如何和 report 方法联系起来的呢  
    谢谢  *^___^*
    2009年12月7日 6:20

答案

  • 不采用委托,直接采用this.Report方法也可以执行,
    因为你的这个方法和委托的参数,返回值都一样,直接调用也没问题,
    但是采用委托有很多好处,你可以看看C#委托这方面的介绍.


    努力+方法=成功
    • 已标记为答案 咪咪 2009年12月8日 1:20
    2009年12月7日 9:56

全部回复

  • 首先你要明确委托要和一个方法绑定,你的例子中委托和方法绑定时通过这句话的
                                 CallBack myCallBack = new CallBack(this.Report);

    按原先的设计能正常运行,估计你没有把委托和方法绑定,你这样试试
    加入命名空间using System.Runtime.InteropServices;

      public partial class Form2 : Form
        {

            public delegate bool CallBack(int hwnd, int lParam);
            CallBack myCallBack;
            [DllImport("user32")]
            public static extern int EnumWindows(CallBack cb, int y);
            public Form2()
            {
                InitializeComponent();
                 myCallBack = new CallBack(this.Report);
            }

              public bool   Report(int hwnd, int lParam)
            {
                try
                {
                                 this.listBox1.Items.Add(hwnd.ToString());

                    return true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    throw;
                }

        }

              private void button1_Click(object sender, EventArgs e)
              {
                  try
                  {
                      EnumWindows(myCallBack, 0);
                      //EnumWindows(this.Report, 0)
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show(ex.Message);
                      throw;
                  }

     

              }
            }


    努力+方法=成功
    2009年12月7日 7:12
  • 谢谢开心老师
     原先的代码 
      是这样 

     public delegate bool CallBack(int hwnd, int lParam);
          #region  dllimport
          [DllImport("user32")]
          public static extern int EnumWindows(CallBack cb, int y);
    一个按钮事件 : 
     try
                {
      CallBack myCallBack = new CallBack(this.Report);
          EnumWindows(myCallBack, 0);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    throw;
                }
      另一个方法 
     public bool   Report(int hwnd, int lParam)
            {
                try
                {
                               this.listBox1.Items.Add(hwnd );
    
                    return true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    throw;
                }
                 
            }
    
    

     运行没有问题
    我把这句话
      CallBack myCallBack = new CallBack(this.Report); //我吧这句话注释掉了
          EnumWindows(this.Report, 0); 直接用report方法带进去了
    也能运行起来 
    我就是看不明白 report应该没有和callback 这个委托关联起来吧
    msdn 不是这样写的吗 

    lpEnumFunc
    [in] Long pointer to an application-defined callback function. For more information, see EnumWindowsProc.
    第一个参数应该是一个回调方法 
    谢谢
    2009年12月7日 7:20
  • 我给你写的代码 委托和事件关联是在构造函数中进行的
    MSDN中的关联是在执行BUTTON的按钮事件中进行关联的,只是进行关联的时间不同,效果一样。


    努力+方法=成功
    2009年12月7日 7:31
  • 专家  我的意思是 为什么
      不需要这句话 
    CallBack myCallBack = new CallBack(this.Report);
    EnumWindows(myCallBack, 0);

    直接 
       EnumWindows(this.Report, 0);  替换上面2行代码 
    也能运行
    也就是说 代码里面根本就没有CallBack myCallBack = new CallBack(this.Report);这句话
     编辑器为什么会认为 report方法就是回调函数 不会报错
    -_-||
    你看我的代码里面根本就没有 CallBack myCallBack = new CallBack(this.Report);这句话 运行正常
    public partial class Form1 : Form
        {
          public delegate bool CallBack(int hwnd, int lParam);
          #region  dllimport
          [DllImport("user32")]
          public static extern int EnumWindows(CallBack cb, int y);
          #endregion
         
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    EnumWindows(this.Report, 0);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    throw;
                }
            }
            public bool   Report(int hwnd, int lParam)
            {
                try
                {
                     this.listBox1.Items.Add(hwnd.ToString() );
    
                    return true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    throw;
                }       
            }
    
        }
    2009年12月7日 9:48
  • 不采用委托,直接采用this.Report方法也可以执行,
    因为你的这个方法和委托的参数,返回值都一样,直接调用也没问题,
    但是采用委托有很多好处,你可以看看C#委托这方面的介绍.


    努力+方法=成功
    • 已标记为答案 咪咪 2009年12月8日 1:20
    2009年12月7日 9:56