前提・実現したいこと
先日からC#を触り始めました。
で、C#からDLLを呼び出そうとしているのですが、
引数にコールバック用の関数ポインタがあります。
このポインタにコールバックを指定するケースは知らないのですが、
通常は-1をセットするようです。
しかし、関数ポインタに-1をセットする方法がわかりません。
具体的には、
winsqlite3.dllのsqlite3_bind_text関数の第5引数になります。
該当のソースコード
DLL
1typedef void (SQLITE_CALLBACK *sqlite3_destructor_type)(void*); 2#define SQLITE_STATIC ((sqlite3_destructor_type)0) 3#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) 4 5SQLITE_API int SQLITE_APICALL sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(SQLITE_CALLBACK *)(void*));
C#
1[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 2public delegate int sqlite3_destructor_type(IntPtr param); 3 4[DllImport("winsqlite3.dll", CallingConvention = CallingConvention.Cdecl)] 5extern static int sqlite3_bind_text(IntPtr Stmt, int iCol, string Value, int Length, sqlite3_destructor_type cb); 6 7const sqlite3_destructor_type SQLITE_TRANSIENT = (sqlite3_destructor_type)(-1); 8 9int status = sqlite3_bind_text(Stmt, i, args[i].ToString(), -1, SQLITE_TRANSIENT);
試したこと
宣言側でバカ正直にコールバック宣言を書かずに、IntPtrにしてしまえば逃げれるとは思いますが...
C#
1[DllImport("winsqlite3.dll", CallingConvention = CallingConvention.Cdecl)] 2extern static int sqlite3_bind_text(IntPtr Stmt, int iCol, string Value, int Length, IntPtr cb); 3 4static IntPtr SQLITE_TRANSIENT = (IntPtr)(-1);
回答1件
あなたの回答
tips
プレビュー