【发布时间】:2012-12-20 13:40:18
【问题描述】:
我正在尝试编写一个函数,该函数在顶级窗口上进行迭代,如果它们满足一组条件,则将它们放入列表中。目前,我可以通过将窗口添加到静态 List<IntPtr> instances 变量中来使其工作,但我想将指针传递给 EnumWindowsProc 的 lParam 中的列表以避免此静态变量.
我想我必须使用fixed 来修复列表在内存中的位置,但我不确定如何执行此操作。我尝试将列表传递给我的回调函数:
unsafe
{
fixed (void* dp = &instances)
{
WinApi.EnumWindows(new WinApi.EnumWindowsProc(FindPPWindows), dp);
}
}
但我明白了
Cannot take the address of, get the size of, or declare a pointer to a managed type ('System.Collections.GenericList<IntPtr>')
我对 c# 很陌生,所以我真的不知道如何做到这一点 - 或者即使有可能,我也读过编组包含引用的托管类型是不可能的,但我只需要在内存中修复它并创建一个指向它的指针,然后将指针转换回去并使用它。如果有的话,我怎样才能完成这项工作?
【问题讨论】:
-
您不能创建指向类的指针。您唯一能做的就是创建一个数组,并传递第一项的指针,
void* dp = &instancesArray将指向第一项。但是你仍然必须保持数组大小,并发送一个足够大的数组来包含所有窗口。
标签: c# winapi interop marshalling fixed