2011-02-26 205 views
0

helo 我知道这可能很简单,但请相信我,我没有从我在google上发现的内容中读到它。 我尝试做如下因素的事情:将类类型对象转换为Intptr

unsafe static IntPtr __convertSearcherCallbackParameterToIntPtr (SearcherCallbackParameter searcherCallbackParameter) { return (*(IntPtr*)&searcherCallbackParameter); }

其中SearcherCallbackParameter是一类,我需要将其转换为一个IntPtr这样我就可以把它作为一个参数,一个Windows API。

我得到如下因素的错误: 不能走的地址,获取的大小,或指针声明到托管型

+0

CLR保留将您在内存中移动的权利,因此即使您可以获取托管对象的地址,该地址几乎肯定会非常快地失效。你介意说明你正在尝试使用哪个API调用? – Jimmy 2011-02-26 08:27:53

+1

我想你EnumWindows和EnumChildWindows,我需要发送一个指针(或IntPtr)SearcherCallbackParameter。所以我的回调可以接收它。 – hgfhnfg 2011-02-26 08:30:42

+0

野兔是我声明的fcts:private delegate bool EnumWindowsProc(IntPtr hWnd,IntPtr lParam); [DllImport(“user32.dll”,CharSet = CharSet.Auto,SetLastError = true)] private static extern bool EnumWindows(EnumWindowsProc callback,IntPtr extraData); – hgfhnfg 2011-02-26 08:31:55

回答

1

你可以只用一个简单的.NET委托,互操作层会照顾的编组。下面的代码从http://pinvoke.net/default.aspx/user32/EnumWindows.html

本机函数声明回调函数参数只是一个整数,但它实际上不必是一个IntPtr。

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


[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool EnumWindows(CallBackPtr lpEnumFunc, UInt32 lParam); 


static bool callbackreport(int hwnd, int lparam) 
{ 
    Console.WriteLine("{0} {1}", hwnd, lparam); 
    return true; 
} 

static void Main(string[] args) 
{ 
    EnumWindows(Program.callbackreport,0); 
} 
+0

谢谢吉米! – hgfhnfg 2011-02-26 11:14:25