LibVLC 访问冲突

LibVLC Access Violation

我正在尝试在 LibVLC 中设置日志记录,但 运行 遇到了一些问题。

我使用的函数是libvlc_log_set_file,文档如下: LibVLC logging docs

这是我现在的代码:

//header
private:
    FILE * logFile;

//source
logFile = fopen(path.c_str(), "w");
if(logFile != NULL)
{
    libvlc_log_set_file(_libvlc_instance, logFile);
}

libvlc_log_set_file 行我得到这个错误,"Unhandled exception at 0x77559E33 (ntdll.dll) in nw.exe: 0xC0000005: Access violation writing location 0x00000014."

我可以用 fputs() 打开和写入文件。

我正在使用 NW.js 和 WebChimera.js 在 64 位 Windows 7 机器上使用 Visual Studio 2013 编译为 32 位。

有什么想法吗?

我今天遇到了这个问题。我无法使用 libvlc_log_set_file 解决它。相反,我选择使用 libvlc_log_set 来设置回调并使用该方法写入日志文件。这是一个例子,它显示了需要做什么。我不推荐全局文件指针,它只是为了这个快速示例。

注意:logpath 是一个包含日志文件路径的 const char*。此外,您可能希望 flockfile 使该线程安全。您还可以在其中添加一个 switch 语句来处理 LIBVLC_NOTICE、LIBVLC_ERROR、LIBVLC_WARNING 和 LIBVLC_DEBUG 的级别参数,从而使您的日志记录具有一定的粒度。

bool g_loggingEnabled = true;
FILE* g_logfp = nullptr;

void logcb(void *data, int level, const libvlc_log_t *ctx, const char *fmt, va_list args)
{
    if (!g_loggingEnabled) return;

    if (g_logfp == nullptr)
    {
        errno_t err = fopen_s(&g_logfp, logpath, "w");

        if (err != 0)
        {
            g_loggingEnabled = false;
            return;
        }
    }

    vfprintf(g_logfp, fmt, args);
}

附录:在 Windows 上,您可能希望使用设置了 FILE_SHARE_READ 标志的 CreateFile 并使用 WriteFile,以便外部文本编辑器可以在实时记录时查看文件.如果这样做,请查看 vsprintf_s 而不是 vfprintf 来填充字符缓冲区,然后您将在 logcb 方法中将其传递给 WriteFile。