c++ - LibVLC 访问冲突

标签 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() 打开文件并写入文件。

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

有什么想法吗?

最佳答案

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

关于c++ - LibVLC 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31334594/

相关文章:

c++ - 在 C++ 中使用 std::addressof() 函数模板而不是使用 operator& 有什么好处吗?

c++模板运算符未找到匹配项

c++ - 有限状态机 - 每个状态是否都必须由 switch 语句中的一个 case 表示?

c++ - Qt 5 和 LibVLC

java - 在多个窗口中使用克隆的 VLCJ

c++ - 如何重载 + 运算符(友好),以便可以将数组元素的值添加到类对象的字段中?

c++ - OpenCV IplImage AccessViolationException

C++ memcpy 和愉快的访问冲突

c++ - 尝试将纹理映射到 GLSL 中的三角形时发生访问冲突

python - Pygame 幻灯片延迟通常很长