LibVLC访问冲突

时间:2015-07-10 07:08:47

标签: c++ access-violation libvlc nw.js ntdll

我正在尝试在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行,我收到此错误," nw.exe中的0x77559E33(ntdll.dll)处的未处理异常:0xC0000005:访问冲突写入位置0x00000014。"

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我今天遇到了这个问题。我无法使用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。