0

これは 64 ビットでのみ発生しますが、コードは 32 ビット OS で動作します

2 行のコードがあり、ポインターから最初の構造体を取得できますが、2 行目でアプリケーションがクラッシュします。

変数の型を (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 Faultingアプリケーションの開始時刻: 0x01cdcb0bf90a0678 障害のあるアプリケーション パス: C:\XXXXXXXXX.exe 障害のあるモジュール パス: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll レポート ID: 3857cdd8-36ff-11e2-ad19-00e04d3a73da

イベント ログの 2 番目のエラー (.Net ランタイム)

アプリケーション: ApplicationName.exe フレームワークのバージョン: v4.0.30319 説明: IP 000007FEFAD22AD3 (000007FEFAC50000) の .NET ランタイムで終了コード 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;
}
4

0 に答える 0