我正在为 LibVLC 媒体库编写一个超级简单的超轻量级 .Net 包装器,因为我唯一需要访问的是播放、暂停和停止媒体文件的能力。我已经就此发布了几个问题并得到了一些答案,但不幸的是我还有更多问题。
我们将从顶部开始向下工作。
文档首先说明我必须使用此规范调用函数来初始化 VLC:
libvlc_instance_t* libvlc_new (int argc, const char *const *argv)
我为此定义了以下方法:
[DllImport("libvlc", EntryPoint = "libvlc_new",
CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr NewCore(int argc, IntPtr argv);
我正在调用这样的函数:
private IntPtr Instance;
this.Instance = DGLibVLC.NewCore(0, IntPtr.Zero);
我已经尝试了几种不同的方法。最初我不知道 CallingConvention 会导致堆栈不平衡,这首先将我带到了这里。该问题已解决,并且该方法经过了多次迭代,但没有一次证明是成功的,我的意思是 IntPtr 在方法调用后始终为 0。我已经像上面那样尝试过,第二个参数是String[] argc
, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[]
,我尝试让它返回一个 Long (这实际上导致 Long 在其中有一个值),但到目前为止没有任何工作正常。
有谁知道从 LibVLC DLL 库中调用此函数的正确方法?
编辑:根据一个建议,我尝试调用库的错误消息函数:
规格:
const char* libvlc_errmsg (void)
执行:
[DllImport("libvlc", EntryPoint = "libvlc_errmsg",
CallingConvention = CallingConvention.Cdcel)]
public static extern string GetLastError();
称呼:
Console.WriteLine(DGLibVLC.GetLastError());
结果:
Null
文档指出,如果没有错误,它将返回 Null。这必须表明初始函数调用NewCore
工作正常,但仍以某种方式出错。
为了涵盖所有基础,我检查了 DLL 是否与文档匹配,它们确实如此。2.0.6.0。我引用的文档在这里。
编辑:我可以确认没有错误。当使用初始化为零的 long 变量来存储 NewCore 的结果时,我可以看到它返回了一些东西。我在这里做错的是我试图存储由返回指向对象的指针的非托管函数返回的指针。如何存储指向被传回的不透明结构引用的指针?