首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环通过IntPtr以生成结构数组时出错

循环通过IntPtr以生成结构数组时出错
EN

Stack Overflow用户
提问于 2013-04-06 03:29:17
回答 1查看 447关注 0票数 1

我在从另一个struct中的IntPtr构建struct数组时遇到了问题。

这个结构是由我使用的Windows API返回的:

代码语言:javascript
复制
public struct DFS_INFO_9 {
    [MarshalAs(UnmanagedType.LPWStr)]
    public string EntryPath;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string Comment;
    public DFS_VOLUME_STATE State;
    public UInt32 Timeout;
    public Guid Guid;
    public UInt32 PropertyFlags;
    public UInt32 MetadataSize;
    public UInt32 SdLengthReserved;
    public IntPtr pSecurityDescriptor;
    public UInt32 NumberOfStorages;
    public IntPtr Storage;
}

[DllImport("netapi32", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int NetDfsEnum([MarshalAs(UnmanagedType.LPWStr)]string DfsName, int Level, int PrefMaxLen, out IntPtr Buffer, [MarshalAs(UnmanagedType.I4)]out int EntriesRead, [MarshalAs(UnmanagedType.I4)]ref int ResumeHandle);

我正在尝试获取IntPtr Storage引用的DFS_STORAGE_INFO_1数组。

下面是这个结构(如果重要的话):

代码语言:javascript
复制
public struct DFS_STORAGE_INFO_1 {
    public DFS_STORAGE_STATE State;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string ServerName;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string ShareName;
    public IntPtr TargetPriority;
}

到目前为止,这段代码一直在努力获取只有一个存储的DFS_INFO_9,但在尝试封送数组中的第二个项目时失败了。

代码语言:javascript
复制
DFS_INFO_9 info = GetInfoFromWinApi();
List<DFS_STORAGE_INFO_1> Storages = new List<DFS_STORAGE_INFO_1>();
for (int i = 0; i < info.NumberOfStorages; i++) {
    IntPtr pStorage = new IntPtr(info.Storage.ToInt64() + i * Marshal.SizeOf(typeof(DFS_STORAGE_INFO_1)));
    DFS_STORAGE_INFO_1 storage = (DFS_STORAGE_INFO_1)Marshal.PtrToStructure(pStorage, typeof(DFS_STORAGE_INFO_1));
    Storages.Add(storage);
}

我得到一个FatalExecutionEngineError,它显示错误代码0x0000005 (访问被拒绝)。我假设DFS_STORAGE_INFO_1的大小被错误计算,导致编组尝试访问分配给数组的内存之外的内存。但这是在i = 1上发生的,当时可能有7个存储空间需要通过。也许我的想法有缺陷,但我不知道如何纠正这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-08 22:24:20

DFS_STORAGE_INFO_1的实际定义如下:

代码语言:javascript
复制
public struct DFS_STORAGE_INFO_1 {
    public DFS_STORAGE_STATE State;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string ServerName;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string ShareName;
    DFS_TARGET_PRIORITY TargetPriority;
}

TargetPriority是一种结构,定义了here

代码语言:javascript
复制
public struct DFS_TARGET_PRIORITY {
    public DFS_TARGET_PRIORITY_CLASS TargetPriorityClass;
    public UInt16 TargetPriorityRank;
    public UInt16 Reserved;
}

public enum DFS_TARGET_PRIORITY_CLASS {
    DfsInvalidPriorityClass = -1,
    DfsSiteCostNormalPriorityClass = 0,
    DfsGlobalHighPriorityClass = 1,
    DfsSiteCostHighPriorityClass = 2,
    DfsSiteCostLowPriorityClass = 3,
    DfsGlobalLowPriorityClass = 4
}

至于FatalExecutionEngineError,我认为结构DFS_STORAGE_INFO_1的大小被错误地计算了,因为它的定义不正确。当尝试将指针转换到它们引用的结构时,下一个索引是错误的,因为大小是关闭的。在转换内存块时,它可能引用了一个本不应该访问的块,从而抛出了“访问被拒绝(0x0000005)”错误。

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

https://stackoverflow.com/questions/15841996

复制
相关文章

相似问题

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