サイトアイコン たーちゃんの「ゼロよりはいくらかましな」

【C#】ポインタの構造体変換で気をつけること

 

だいぶ前の解析していたノートがEvernoteから

出てきたので、ちょっと公開しようかなと。

INVOKECOMMANDINFO ici = (INVOKECOMMANDINFO) Marshal.PtrToStructure(pici, typeof(ShellLib.INVOKECOMMANDINFO ));
とかでMarshalする場合、32bitでは以下で問題ない
    [ StructLayout(LayoutKind .Sequential)]
    public struct STGMEDIUM {
        public uint tymed;
        public uint hGlobal;
        public uint pUnkForRelease;
    }
ただ、64bitではint型は8バイト必要なため、uintでは桁あふれし、
正しい値が取得できない。
そのため、uint→ulongにすることで対応可能。
    [ StructLayout (LayoutKind .Sequential)]
    public struct STGMEDIUM {
        public ulong tymed;
        public ulong hGlobal;
        public ulong pUnkForRelease;
    }
または、intをIntPtr型にし、ToInt32メソッドや、ToInt64メソッドで
対応することも可能。
Win32APIの宣言や、使用時においてはuintのままで問題ない。
その引数に渡すポインタを上記対応できっちり取得できればよい。


にほんブログ村


人気ブログランキング

モバイルバージョンを終了