对于采用 var args 的函数,正确的 PInvoke 签名是什么?

发布于 2024-08-18 13:01:41 字数 405 浏览 3 评论 0原文

有一个本机函数:

int sqlite3_config(int, ...);

我想 PInvoke 到此函数。目前,我有这样的声明:

[DllImport("sqlite3", EntryPoint = "sqlite3_config")]
public static extern Result Config (ConfigOption option);

(Result 和 ConfigOption 是 enum Result : int { ... } 形式的枚举。)

我实际上只对此函数的单参数版本感兴趣,并且不'不需要其他参数。这是正确的吗?

我也很好奇你将如何声明两个参数形式(也许需要 2 个 IntPtr?)。

There is a native function:

int sqlite3_config(int, ...);

I would like to PInvoke to this function. Currently, I have this declaration:

[DllImport("sqlite3", EntryPoint = "sqlite3_config")]
public static extern Result Config (ConfigOption option);

(Result and ConfigOption are enums of the form enum Result : int { ... }.)

I am actually only interested in the single parameter version of this function and don't need the other args. Is this correct?

I am also curious as to how you would declare the two argument form (perhaps it would take 2 IntPtrs?).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

就此别过 2024-08-25 13:01:42

您需要使用 __arglist 关键字(未记录),Bart# 有一个 关于它的好博客。

示例

class Program
{
    [DllImport("user32.dll")]
    static extern int wsprintf([Out] StringBuilder lpOut, string lpFmt, __arglist);

    static void Main(String[] args)
    {
        var sb  = new StringBuilder();
        wsprintf(sb, "%s %s %s", __arglist("1", "2", "3"));
        Console.Write(sb.ToString());
    }       
}

这不是 pinvoking vararg 方法的标准方法,大多数解决方案会将其包装在多种方法中,例如

[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)]
static extern var MyVarArgMethods1(String fmt, 
    String arg1);

[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)]
static extern var MyVarArgMethods2(String fmt, 
    String arg1, String arg2);

You need to use the __arglist keyword (which is undocumented), Bart# had a nice blog about it.

Example

class Program
{
    [DllImport("user32.dll")]
    static extern int wsprintf([Out] StringBuilder lpOut, string lpFmt, __arglist);

    static void Main(String[] args)
    {
        var sb  = new StringBuilder();
        wsprintf(sb, "%s %s %s", __arglist("1", "2", "3"));
        Console.Write(sb.ToString());
    }       
}

The is no standard way of pinvoking vararg methods, most solutions will wrap it in several methods e.g.

[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)]
static extern var MyVarArgMethods1(String fmt, 
    String arg1);

[DllImport("MyDll", CallingConvention=CallingConvention.Cdecl)]
static extern var MyVarArgMethods2(String fmt, 
    String arg1, String arg2);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文