Hikvision HCNetSDK Ошибка 11: NET_DVR_ORDER_ERROR — неверный порядок вызова
- Функция SDK возвращает
FALSEс кодом ошибки11. - Попытка чтения данных до завершения процесса поиска (Search/Find Handle).
- Вызов функций управления потоком до успешной авторизации или инициализации канала.
1. Соблюдение строгой последовательности API при поиске файлов
Классическая ошибка — вызов NET_DVR_FindNextFile без предварительного успешного вызова NET_DVR_FindFile или после его закрытия:
// 1. Инициализация поиска
LONG lFindHandle = NET_DVR_FindFile_V40(lUserID, &struFindParam);
if (lFindHandle < 0) {
printf("FindFile failed: %d\n", NET_DVR_GetLastError());
return;
}
// 2. Итеративное чтение в цикле
NET_DVR_FINDDATA_V40 struFileData = { 0 };
while (true) {
LONG lStatus = NET_DVR_FindNextFile_V40(lFindHandle, &struFileData);
if (lStatus == NET_DVR_FILE_SUCCESS) {
printf("File: %s, Size: %d\n", struFileData.sFileName, struFileData.dwFileSize);
} else if (lStatus == NET_DVR_FILE_NOFIND || lStatus == NET_DVR_NOMOREFILE) {
break; // Конец списка
} else if (lStatus == NET_DVR_FILE_EXCEPTION) {
break;
}
}
// 3. ОБЯЗАТЕЛЬНОЕ закрытие хэндла поиска
NET_DVR_FindClose_V30(lFindHandle);2. Проверка последовательности работы с видеопотоком
Нельзя вызывать функции управления декодером (NET_DVR_PlayBackControl, пауза, перемотка) до получения подтверждения успешного старта сессии воспроизведения (NET_DVR_PlayBackByTime).
3. Исключение повторного закрытия дескрипторов (Double Free)
Сбрасывайте переменные дескрипторов в -1 сразу после вызова функций остановки/закрытия, чтобы избежать повторного обращения к уничтоженным объектам.
Частые вопросы (FAQ)
Почему ошибка 11 возникает при попытке сделать скриншот кадра (NET_DVR_CapturePicture)?
Функция NET_DVR_CapturePicture требует активного декодирования потока в окно (HWND). Если вы захватываете поток в режиме без окна (RAW stream), используйте NET_DVR_SetRealDataCallBack и декодируйте кадр самостоятельно.
Можно ли выполнять поиск файлов по нескольким каналам параллельно?
Да, но каждый поток обязан создавать собственный независимый FindHandle через NET_DVR_FindFile_V40 и освобождать его своим вызовом NET_DVR_FindClose.
Что означает ошибка 11 при конфигурации параметров камеры?
Это означает, что нарушен порядок транзакции: например, отправлен запрос на сохранение данных (SetDVRConfig) без предварительного запроса базовой версии структуры через (GetDVRConfig).
Как гарантировать правильный порядок вызовов в асинхронном коде?
Используйте конечные автоматы (State Machine) или механизмы синхронизации (Mutex / Semaphore / Promises), предотвращающие вызов зависимых функций до перехода сессии в статус 'Ready'.