スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    【C#】.net Framework でWin32APIを使うときの注意

     久々の更新です。

    今回は、C#でWin32APIをいじっていてはまったのでメモ。
    (って別にC#に限らず、.net framework言語なら共通だけど・・。)

    ■どこではまったか。
     GetWindowRect で他のアプリのウィンドウサイズを取得しようとしたら
     「System.AccessViolationException はハンドルされませんでした。
    保護されているメモリに読み取りまたは書き込み操作を行おうとしました。
    他のメモリが壊れていることが考えられます。」
    ってなっちゃう・・。

    ■な~んでか。
     その原因は宣言にあった。
    [DllImport("user32")]
        static extern int GetWindowRect(IntPtr hWnd, RECT lpRect);

    と書いていたが、 これだと暗黙的にRECTが値渡しになってしまう。
    確かに、C#ではrefをつけなければ値渡しだ。
    しかし、APIで使う構造体は、構造体へのアドレスを使うので 参照渡し。だからrefが必要。
    これがないと、引数のlpRectには、RECT構造体のアドレスが来るのに、これを構造体そのものとして読んでしまい、
    アドレス分しか長さがないのにRECT構造体のサイズ分メモリを読むので、はみ出たところは不正アクセスになり、AccessViolationExceptionが起きる。 うん。納得。
    [DllImport("user32")]
      static extern int GetWindowRect(IntPtr hWnd, ref RECT lpRect);
    ↑こう書くのが正解。
    なるほどね~。
    スポンサーサイト

    テーマ : プログラミング
    ジャンル : コンピュータ

    プロフィール

    ざっち

    Author:ざっち
    ざっちのーと
    ♪自由なSEのメモ帳です♪

    ざっちのスキル一覧
    ----------------
    上級(手足も同然!)
    ・.net FrameWork
    ・C#
    ・SqlServer
    ・VisualBasic6.0
    ----------------
    中級(だいたいOK!)
    ・WPF(XAML)
    ・Android
    ・WindowsMobile6.5
    ・HTML
    ----------------
    下級(や、やればできるさ!)
    ・PHP
    ・JavaScript
    ・SilverLight
    ・SQLite
    ・Python(だってjetCreaterが・・・)
    ・C++(OpenCVいじってみたくて・・・)
    ----------------
    最近のお気に入り
    ・WPF(XAML)
    ・Android
    ・GoogleAPI
    ----------------

    最近の記事
    月別アーカイブ
    カテゴリー
    夢見る羊さん
    地球の名言Ⅱ

    presented by 地球の名言

    Twitter...A

    Twitter < > Reload

    ブロとも申請フォーム

    この人とブロともになる

    ブログ内検索
    RSSフィード
    リンク
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。