質問する質問する
 

回答済みSipEnumIMをC#で使用するには

  • 2009年8月5日 0:31けんしん ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    いつもお世話になっています。

    またSIP関係の質問なのですが...

    Win32APIのSipEnumIMをC#で使用したいのですが、C#のコールバック関数に制御が来ません。
    具体的には、ボタンをタップされたらSipEnumIMをコールしてコールバック関数の設定をしてます。

            private void button1_Click(object sender, EventArgs e)
            {
                IMENUMPROC pEnumIMProc;
                IntPtr pEnumIMProcPtr;
                // デリゲードにコールバック関数の設定
                pEnumIMProc = new IMENUMPROC(SipEnumIMProc);
                // デリゲードから関数ポインターを取得
                pEnumIMProcPtr = Marshal.GetFunctionPointerForDelegate(pEnumIMProc);
                // API呼び出し
                SipEnumIM(pEnumIMProcPtr);
            }

            private int SipEnumIMProc(ref IMENUMINFO pIMInfo)
            {
                // ここに来ない!
                return 1;
            }

            delegate int IMENUMPROC(ref IMENUMINFO imenuinfo);

            [DllImport("Coredll.dll")]
            static extern int SipEnumIM(IntPtr pEnumIMProcPtr);

            [StructLayout(LayoutKind.Sequential)]
            struct GUID
            {
                Int32 Data1;
                Int16 Data2;
                Int16 Data3;
                [MarshalAs(UnmanagedType.U1, SizeConst = 8)]
                Byte[] Data4;
            }
            [StructLayout(LayoutKind.Sequential)]
            struct IMENUMINFO
            {
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
                string szName;
                GUID clsid;
            }

    コールバック関数の設定が悪いのか、そもそもSipEnumIMをC#で使用できないのか、切り分けできていません。

    ご教授、宜しくお願いします。

回答

  • 2009年8月6日 8:50けんしん ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み
    一応、解決しましたので報告します。
    参考のため、動作したソースをアップしますので、参考にして下さい。

    原因はコールバック関数の引数の設定が間違っていたようです。
    構造体のポインターを受け取り、構造体にセットする方法で解決しました。

            private void button1_Click(object sender, EventArgs e)
            {
                IMENUMPROC pEnumIMProc;
                IntPtr pEnumIMProcPtr;
                // デリゲードにコールバック関数の設定
                pEnumIMProc = new IMENUMPROC(SipEnumIMProc);
                // デリゲードから関数ポインターを取得
                pEnumIMProcPtr = Marshal.GetFunctionPointerForDelegate(pEnumIMProc);
                // API呼び出し
                SipEnumIM(pEnumIMProcPtr);
            }

            private int SipEnumIMProc(IntPtr pIMInfo)
            {
                // ポインターから構造体へ変換
                IMENUMINFO IMInfo = (IMENUMINFO)Marshal.PtrToStructure(pIMInfo, typeof(IMENUMINFO));
                // 列挙の続行
                return 1;
            }

            delegate int IMENUMPROC(IntPtr imenuinfo);

            [DllImport("Coredll.dll")]
            static extern int SipEnumIM(IntPtr pEnumIMProcPtr);

            [StructLayout(LayoutKind.Sequential)]
            struct GUID
            {
                Int32 Data1;
                Int16 Data2;
                Int16 Data3;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
                Byte[] Data4;
            }
            [StructLayout(LayoutKind.Sequential)]
            struct IMENUMINFO
            {
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
                string szName;
                GUID clsid;
            }

    まだC#を初めて1年弱なので、基本的な所を理解していないようです。
    日々これ精進ですね。

    以上

すべての返信

  • 2009年8月6日 8:50けんしん ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み
    一応、解決しましたので報告します。
    参考のため、動作したソースをアップしますので、参考にして下さい。

    原因はコールバック関数の引数の設定が間違っていたようです。
    構造体のポインターを受け取り、構造体にセットする方法で解決しました。

            private void button1_Click(object sender, EventArgs e)
            {
                IMENUMPROC pEnumIMProc;
                IntPtr pEnumIMProcPtr;
                // デリゲードにコールバック関数の設定
                pEnumIMProc = new IMENUMPROC(SipEnumIMProc);
                // デリゲードから関数ポインターを取得
                pEnumIMProcPtr = Marshal.GetFunctionPointerForDelegate(pEnumIMProc);
                // API呼び出し
                SipEnumIM(pEnumIMProcPtr);
            }

            private int SipEnumIMProc(IntPtr pIMInfo)
            {
                // ポインターから構造体へ変換
                IMENUMINFO IMInfo = (IMENUMINFO)Marshal.PtrToStructure(pIMInfo, typeof(IMENUMINFO));
                // 列挙の続行
                return 1;
            }

            delegate int IMENUMPROC(IntPtr imenuinfo);

            [DllImport("Coredll.dll")]
            static extern int SipEnumIM(IntPtr pEnumIMProcPtr);

            [StructLayout(LayoutKind.Sequential)]
            struct GUID
            {
                Int32 Data1;
                Int16 Data2;
                Int16 Data3;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
                Byte[] Data4;
            }
            [StructLayout(LayoutKind.Sequential)]
            struct IMENUMINFO
            {
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
                string szName;
                GUID clsid;
            }

    まだC#を初めて1年弱なので、基本的な所を理解していないようです。
    日々これ精進ですね。

    以上