Нарушение доступа к LibVLC

Я пытаюсь настроить ведение журнала в 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.

Есть идеи?

1

Решение

У меня была именно эта проблема сегодня. Я не смог решить ее с помощью 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.

0

Другие решения


По вопросам рекламы [email protected]