我正在尝试在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位。
有什么想法吗?
答案 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。