シェアする

  • このエントリーをはてなブックマークに追加





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

シェアする

  • このエントリーをはてなブックマークに追加
  • 0

だいぶ前の解析していたノートが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のままで問題ない。
その引数に渡すポインタを上記対応できっちり取得できればよい。

ブログランキング・にほんブログ村へ
にほんブログ村


人気ブログランキング

20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。

今風にいうとフルスタックエンジニアということになるのかしら??

→ 詳細プロフィールというか、生い立ちはこちら

→スキルシートをご覧になる場合はこちら

→お仕事のご依頼やお見積りなどお問い合わせはこちらから!

シェアする

  • このエントリーをはてなブックマークに追加

フォローはいかがですか?