【解決方法】C# で intptr 値を構造体に変換する方法

プログラミングQA


C++ から C# 構造への相互運用を試みています。
構造 c#

public static IntPtr tempNode = IntPtr.Zero;

また、要件に従って Marshal.PtrToStructure、Marshal.PtrToStringAuto を使用しています。

今私は64ビットコンパイルされたexeで試しています.C++からC#に共有されたアドレスは正しいですが、関数は
Marshal.PtrToStructure、Marshal.PtrToStringAuto は、構造内のデータをシフトし、ジャンク値を埋めています。
8 バイトのうち、4 バイトのみがコピー/修正されます。

私が試したこと:

ノードは私のコードの構造です

public struct NODE
    {

        public ulong ullSector;
        public ulong ullSize;

        unsafe public NODE* pNext;
        unsafe public NODE* pChild;
        unsafe public NODE* pParent;

        public uint dwID;
        public uint dwSelfNum;
        public uint dwParentNum;

        public IntPtr pwcName;  //this variable belongs to WCHAR* in c++

        public ushort wCT;
        public ushort wAT;

        public byte bStatus;
        public byte bMarked;
        public byte bNameLength;
        public byte bIsThisRAWFolderFile;
        public IntPtr Path;
    }

IntPtr tempNode = IntPtr.Zero;
NODE _dynamicNode = (NODE)Marshal.PtrToStructure(tempNode, typeof(NODE));

これらが気に入った場合は、構造内のデータをシフトし、ジャンク値を埋めます。
8 バイトのうち、4 バイトのみがコピーされます

32 ビットで実行する場合、64 でこの問題が発生するだけで問題はありません。

解決策 1

次の例の注記を参照してください。 Marshal.PtrToStructure メソッド (System.Runtime.InteropServices) | Microsoft Docs[^] 64ビットについて。

解決策 3

問題は少しあいまいです、ごめんなさい。 ただし、CharSet 属性 (auto) を設定しても、機能しているようには聞こえません。 Marshal.SystemDefaultCharSize (2 の場合は Unicode、それ以外の場合は Ascii) を確認し、属性で CharSet=Unicode を試すか、CharSet=Ascii を試してください。

また、構造体のレイアウトに問題があるか、レイアウトが指定されていない可能性があります。

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

構造体 MyStruct
{}

リンク: StructLayoutAttribute クラス (System.Runtime.InteropServices) | マイクロソフト ラーン[^]

コメント

タイトルとURLをコピーしました