1

我正在尝试为 LibVLC DLL 库编写一个简单的超简单轻量级包装器。我不需要访问太多,只需要播放暂停和停止媒体文件的能力。我正在查看文档和我发现的其他链接,它解释了旧版本的 LibVLC,但对于最新版本来说它已经过时了。我也尝试了 LibVLC.Net,但它也已过时,我无法在源代码中找到我要查找的内容以将其与我尝试导出的函数相匹配。

我有以下要导出的签名:

libvlc_new (int argc, const char *const *argv)

说明:

argc    the number of arguments (should be 0)
argv    list of arguments (should be NULL)

这就是我正在尝试的方法。

[DllImport("libvlc", EntryPoint = "libvlc_new")]
public static extern IntPtr New(Int32 argc, String[] argv);

描述表明它应该是一个数组,我认为问题出在第二个论点。我试过了:

[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] String[] argv

根据这里,还有一些其他选项,例如这里建议的 String 和 StringBuilder但每次调用该函数时,我都会得到一个不平衡的 PInvoke 堆栈。

我需要知道这个函数的正确调用约定,很可能还有其他几个函数。“PInvoke For Dummies”在线参考会非常好。

4

1 回答 1

2

如果只允许 NULL,则声明参数类型没有多大意义。只需将其声明为 IntPtr 并传递 IntPtr.Zero。

调试器指出您忘记声明 CallingConvention。它不是 .NET 的默认值,这是一个 __cdecl 函数。所以正确的声明是:

[DllImport("libvlc", EntryPoint = "libvlc_new", 
     CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr New(int argc, IntPtr argv);

称为:

New(0, IntPtr.Zero);

请尝试选择一个更好的名字...

于 2013-08-13T12:07:59.463 回答