プラットフォーム呼び出し p/Invoke メモ3 コールバック関数

MSDN 方法: コールバック関数を実装する
MSDN EnumWindows

BOOL EnumWindows(
  WNDENUMPROC lpEnumFunc,  // コールバック関数
  LPARAM lParam            // アプリケーション定義の値
);
using System;
using System.Runtime.InteropServices;

namespace pinvoke
{
    class Program
    {
        public delegate bool CallBack(int hwnd, int lParam);

        [DllImport("user32")]
        public static extern int EnumWindows(CallBack x, int y);

        public static void Main()
        {
            CallBack myCallBack = new CallBack(Report);
            EnumWindows(myCallBack, 0);
        }


        public static bool Report(int hwnd, int lParam)
        {
            Console.Write("Window handle is ");
            Console.WriteLine(hwnd);
            return true;
        }
}


カテゴリー: 相互運用, p/Invoke | タグ: , , | コメントする

プラットフォーム呼び出し p/Invoke メモ2 マネージコードでのプロトタイプの作成

C/C++でのDLL関数のプロトタイプ宣言

int MessageBox(
  HWND hWnd,          // オーナーウィンドウのハンドル
  LPCTSTR lpText,     // メッセージボックス内のテキスト
  LPCTSTR lpCaption,  // メッセージボックスのタイトル
  UINT uType          // メッセージボックスのスタイル
);

C#から P/Invokeで呼び出すときのプロトタイプ

using System.Runtime.InteropServices;
public class ○○Class
[
    [DllImport("user32.dll")]
    public static extern int MessageBox(
        int hWnd,
        String text,
        String caption,
        uint type
    );
}

dllでの関数名とC#での関数名を変えたい場合。

using System.Runtime.InteropServices;
public class ○○Class
[[DllImport("user32.dll", EntryPoint="MessageBox")]
    public static extern int MessageBoxFunction(
        int hWnd,
        String text,
        String caption,
        uint type
    );
}

StringをAnsi文字列に変換

using System.Runtime.InteropServices;
public class ○○Class
[[DllImport("user32.dll", EntryPoint="MessageBoxA",CharSet=CharSet.Ansi)]
    public static extern int MessageBox(
        int hWnd,
        String text,
        String caption,
        uint type
    );
}

StringをUnicode文字列に変換

using System.Runtime.InteropServices;
public class ○○Class
[[DllImport("user32.dll", EntryPoint="MessageBoxW",CharSet=CharSet.UniCode)]
    public static extern int MessageBox(
        int hWnd,
        String text,
        String caption,
        uint type
    );
}

HRESULTを返すアンマネージメソッドのプロトタイプ

HRESULT SHAutoComplete(
  _In_  HWND hwndEdit,
  DWORD dwFlags
);

HRESULT(またはretval)を返す関数のエラーを対応する例外に自動で変更する。

public enum SHAutoCompleteFlags
{
        SHACF_DEFAULT = 0x00000000,
        SHACF_FILESYSTEM = 0x00000001
}

 [DllImportAttribute("shlwapi.dll", EntryPoint = "SHAutoComplete", PreserveSig = false)]
    public static extern void SHAutoComplete(
        IntPtr hwndEdit,
        SHAutoCompleteFlags dwFlags
    );

内部でSetLastErrorで設定されたエラーコードをMarshal.GetLastWin32Error()で取得できるようにする
(GetLastError()のp/Invoke呼び出しではダメらしい)

 [DllImport("user32.dll", SetLastError=true)]
    public static extern int MessageBox(
        IntPtr hWnd,
        String text,
        String caption,
        uint type
    );
カテゴリー: 相互運用, p/Invoke | タグ: , , , , , , , , , , , | コメントする

プラットフォーム呼び出し p/Invoke メモ1

プラットフォーム呼び出し(Platform Invoke)は、マネージ コードから、ダイナミック リンク ライブラリ (DLL) に実装されたアンマネージ関数を呼び出すことができるようにするサービス。

DLL 関数を処理するには

1.DLL 内の関数を識別する。
 少なくても、関数名とDLL名が必要

2.DLL 関数を保持するクラスを作成する。
クラス内では、呼び出す各 DLL 関数に対して静的メソッドを定義する。

3.マネージ コードでのプロトタイプを作成する。

4.DLL 関数を呼び出す。

参考資料:
MSDN アンマネージ DLL 関数の処理 http://msdn.microsoft.com/ja-jp/library/26thfadc(v=vs.100).aspx

カテゴリー: 相互運用, p/Invoke | コメントする

資料公開:わんくま同盟東京勉強会#90 きっと怖くない MVVM & MVPVM

2014/06/07 わんくま同盟東京勉強会 #90 で
「きっと怖くない MVVM & MVPVM」 というタイトルでセッションを行いました

OneDrive セッション資料およびサンプルコード
http://1drv.ms/1pxiWS5

slideshare

カテゴリー: C#, MVVM, XAML環境, 勉強会 | タグ: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | コメントする

2014/01/20 一人暮らし始めました!

まだ足りないものもあるけど、だいぶ落ち着いてきたところ

カテゴリー: その他 | コメントする

依存関係プロパティの作成

Buttonクラスを継承したNewButton
Color型の依存関係プロパティColorを追加するサンプル

    class NewButton:Button
    {
        public static readonly DependencyProperty ColorProperty 
            = DependencyProperty.Register(
                "Color",           //プロパティ名
                typeof(Color),                // プロパティの型
                typeof(NewButton),        // 依存関係プロパティを追加するクラスの型
                new PropertyMetadata(Colors.Black)   //メタデータ
                );

        
        public Color Color
        {
            set { SetValue(ColorProperty, value); }
            get { return (Color)GetValue(ColorProperty); }
        }
    }
カテゴリー: C#, XAML環境 | タグ: , , , , , | コメントする

2013年のまとめ

WordPress.com 統計チームは、2013年のあなたのブログの年間まとめレポートを用意しました。

概要はこちらです。

シドニーにあるオペラハウスのコンサートホールには2,700人が収容できます。2013年にこのブログは約34,000回表示されました。オペラハウスのコンサート13回分になります。

レポートをすべて見るにはクリックしてください。

カテゴリー: その他 | コメントする