使用64位Marshal.PtrToStructure获取结构时出错

时间:2012-11-25 13:47:28

标签: c# pinvoke

  

这只发生在64位,但代码工作在32位操作系统

我有两行代码,我可以从指针获取第一个结构但我的应用程序在第二行崩溃。

我尝试更改变量类型(uint到Int64)我找不到任何解决方案。

GetChangesBuffer getChangesBuffer = (GetChangesBuffer)Marshal.PtrToStructure(_getChangesBuffer, typeof(GetChangesBuffer));
ChangesBuffer buffer = (ChangesBuffer)Marshal.PtrToStructure(getChangesBuffer.Buffer, typeof(ChangesBuffer)); // App crashing in this point

事件日志中的第一个错误(应用程序错误)

  

错误应用程序名称:ApplicationName.exe,版本:1.0.0.0,时间   标记:0x50b214c2错误模块名称:clr.dll,版本:   4.0.30319.269,时间戳:0x4ee9d6e1异常代码:0xc0000005故障偏移量:0x00000000000d2ad3故障进程id:0xb3c故障   应用程序启动时间:0x01cdcb0bf90a0678错误应用程序路径:   C:\ XXXXXXXXX.exe错误模块路径:   C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ clr.dll报告ID:   3857cdd8-36ff-11E2-ad19-00e04d3a73da

事件日志中的第二个错误(.Net运行时)

  

应用程序:ApplicationName.exe Framework版本:v4.0.30319   描述:由于内部错误导致进程终止   带有退出的IP运行时IP 000007FEFAD22AD3(000007FEFAC50000)   代码80131506。

使用过的结构

[StructLayout(LayoutKind.Sequential)]
    public struct GetChangesBuffer
    {
        public IntPtr Buffer;
        public IntPtr UserBuffer;
    }

[StructLayout(LayoutKind.Sequential)]
public struct ChangesBuffer
{
    public uint counter;

    public const int MAXCHANGES_BUF = 20000;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXCHANGES_BUF)]
    public ChangesRecord[] pointrect;
}

[StructLayout(LayoutKind.Sequential)]
public struct ChangesRecord
{
    public uint type;
    public RECT rect;
    public RECT origrect;
    public Point point;
    public uint color;
    public uint refcolor;
}

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int left;
    public int top;
    public int right;
    public int bottom;
}

0 个答案:

没有答案