Я пытаюсь настроить ведение журнала в LibVLC и сталкиваюсь с некоторыми проблемами.
Я использую функцию libvlc_log_set_file, вот документы:
LibVLC регистрация документов
Вот код, который я сейчас имею:
//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
Я получаю эту ошибку «Необработанное исключение в 0x77559E33 (ntdll.dll) в nw.exe: 0xC0000005: Место записи нарушения прав доступа 0x00000014».
Я могу открыть и записать в файл с fputs()
просто хорошо.
Я использую NW.js с WebChimera.js, который компилируется в 32-битную версию с Visual Studio 2013 на 64-битной машине с Windows 7.
Есть идеи?
У меня была именно эта проблема сегодня. Я не смог решить ее с помощью libvlc_log_set_file. Вместо этого я решил использовать libvlc_log_set для настройки обратного вызова и использовать этот метод для записи в файл журнала. Вот пример, он показывает, что нужно сделать. Я не рекомендую указатель глобального файла, это только для этого быстрого примера.
Примечание: logpath — это const char *, который содержит путь к вашему файлу журнала. Кроме того, вы, вероятно, хотите, чтобы этот поток был безопасным. Вы также можете добавить туда оператор 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 вы можете вместо этого использовать CreateFile с установленным флагом FILE_SHARE_READ и использовать WriteFile, чтобы внешние текстовые редакторы могли просматривать файл во время ведения журнала в режиме реального времени. Если вы это сделаете, посмотрите vsprintf_s вместо vfprintf, чтобы заполнить буфер символов, который вы затем передадите в WriteFile в методе logcb.