首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#中的addressof运算符

c#中的addressof运算符
EN

Stack Overflow用户
提问于 2009-11-10 04:17:35
回答 3查看 632关注 0票数 0

在winapi函数中,我必须传递该函数必须使用的回调函数的地址。

所以我声明了一个不安全的类和所有的东西,但是bool* addressofmyfunction = &GetHandle;就是不编译!

请帮助我,或者给我一种替代方法,让我像这样传递地址。

EN

回答 3

Stack Overflow用户

发布于 2009-11-10 04:21:55

在.NET中,delegates用于存储指向函数的指针。例如,如果您有以下函数:

代码语言:javascript
复制
public int GetHandle(int arg1)
{ 
    return arg1 + 10;
}

它的地址定义如下:

代码语言:javascript
复制
Func<int, int> addressOfMyFunction = GetHandle;

你可以这样调用它:

代码语言:javascript
复制
int result = addressOfMyFunction(50);
票数 4
EN

Stack Overflow用户

发布于 2009-11-10 04:22:08

bool* addressofmyfunction = &GetHandle也不能用C或C++编译(正确的语法应该是bool (*addressofmyfunction)() = &GetHandle),但你不能这样做。我不是互操作方面的专家,但我认为你必须使用Marshal.GetFunctionPointerForDelegate

票数 1
EN

Stack Overflow用户

发布于 2009-11-10 04:24:28

函数指针在C#中由委托表示。因为方法不会被垃圾收集器移动,所以您不需要固定它们(或使用不安全的代码)来将它们传递给Win32函数。

示例:

代码语言:javascript
复制
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;
    }
}

EnumThreadWindows on pinvoke.net也有类似的例子。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1703479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档