传递给sqlite_create_function任意指针的内容
What to pass into sqlite_create_function arbitrary pointer
目标:将正则表达式函数绑定到sqlite数据库,因为ADO.NET解决方案在Windows Universal应用程序上不可用。
edit实际上,我真正的目标是在sqlite数据库上进行单词搜索,但这种方法很难得到我需要的结果。
好的,所以我尝试添加到sqlite的sqlite-netc#包装器中。和我不知道我在做什么,就像,这是值得模因的。这是我第一次尝试调用COM任何东西。
函数的文档如下:http://www.sqlite.org/c3ref/create_function.html,但它对这部分的说明是:第五个参数是一个任意指针。函数的实现可以使用sqlite3_user_data()访问该指针。
我认为我不想用它做任何事情,而且我不能传递null。这是我的:
public void BindRegex(Regex regex)
{
CreateFunction(GetConnection().Handle, "regexp", 1, 2, null, IsMatch, null, null);
}
public Func<string, bool> IsMatch = text => regex.IsMatch(text);
[DllImport("sqlite3.dll", EntryPoint = "sqlite3_create_function", CallingConvention=CallingConvention.Cdecl)]
private static extern int CreateFunction(
IntPtr dbHandle,
string functionName,
int numArgs,
int textEncoding,
IntPtr pApp,
IntPtr xFunc,
IntPtr xStep, // null
IntPtr xFinal // null
);
谢谢你在这方面的帮助。
最重要的是,您需要一个委托来声明回调指针,如下所示。
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void UserFunctionCallback(IntPtr context, int nvalues,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]IntPtr[] values);
在函数内部,您必须使用更多的Sqlite API来检索参数值并设置返回值。代码看起来像这样。
var svalues = new string[nvalues];
for (int x = 0; x < nvalues; ++x)
svalues[x - 0] = sqlite3_value_text(values[x]);
var ret = [do something here];
sqlite3_result_text(context, ret, -1, SQLITE_TRANSIENT);
这些都是困难的东西。剩下的只是细节。
相关文章:
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 类型别名允许分配任意指针,尽管 int* 是必需的
- 指针可以用于访问内存中的任何任意区域吗?
- 如何动态执行具有任意参数类型的函数指针
- 定义具有任意范围的指针
- 在C++中,是否可以将任意指针作为输入参数
- 来自任意取消引用指针的输出
- C++映射是否可以包含指向我的任意类的指针
- 指向任意类方法的模板非类型指针
- 设置指向任意维度数组的指针
- 将任意数据传递给没有空指针的函数
- 将任意大小的字符串分配给指向char的指针
- 传递给sqlite_create_function任意指针的内容
- 创建一个模板化结构,以转动具有任意计数 * 的指针以用作 &
- std::atomic_compare_exchange_* 等如何与任意指针一起使用
- 在没有模板的情况下使用任意所属指针
- 如何创建一个可以容纳任意类型指针的容器?
- 在构造函数中初始化任意大小的指针数组
- 从任意Map获取指向mapped_type的指针或引用
- 为什么函数指针定义适用于任意数量的'&'号或星号"*"?