SipEnumIMをC#で使用するには
- いつもお世話になっています。
また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#で使用できないのか、切り分けできていません。
ご教授、宜しくお願いします。
回答
- 一応、解決しましたので報告します。
参考のため、動作したソースをアップしますので、参考にして下さい。
原因はコールバック関数の引数の設定が間違っていたようです。
構造体のポインターを受け取り、構造体にセットする方法で解決しました。
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年弱なので、基本的な所を理解していないようです。
日々これ精進ですね。
以上- 回答としてマーク高橋 忍MSFT, モデレータ2009年8月22日 17:08
すべての返信
- 一応、解決しましたので報告します。
参考のため、動作したソースをアップしますので、参考にして下さい。
原因はコールバック関数の引数の設定が間違っていたようです。
構造体のポインターを受け取り、構造体にセットする方法で解決しました。
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年弱なので、基本的な所を理解していないようです。
日々これ精進ですね。
以上- 回答としてマーク高橋 忍MSFT, モデレータ2009年8月22日 17:08


