Audio/Video кодеки - где прописаны в реестре?
От: Mira  
Дата: 26.05.03 09:06
Оценка:
Слушайте нужна помощь: Мне нужно знать как в систему инсталируется видео/аудио кодек (Direct Show Filter). Какая инфа прописывается в реестр и куда?

Файло кидается в C:\winnt\system32, а в реестре где это прописать, чтобы потом все работало?..

Дело в том что, функция DllRegisterServer() нифига не говорит, то есть говорит вот что:

mycodec.dll was loaded, but the DLLRegisterServer entry point was not found! This file can not be registered!

Мне нужно создать инсталятор кодека... Файлы кодека есть! А Вот куда в реестр их прописать не знаю...

Отвечайте подробнее, пожалуюста...

Заранее спасибо!
Re: Audio/Video кодеки - где прописаны в реестре?
От: visitant Украина  
Дата: 27.05.03 06:54
Оценка:
HKLM,SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers32
HKLM,SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers.desc

могу inf-регистрилку для примера кинуть
Re[2]: Audio/Video кодеки - где прописаны в реестре?
От: Mira  
Дата: 27.05.03 18:48
Оценка:
Здравствуйте, visitant, Вы писали:

V>HKLM,SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers32

V>HKLM,SOFTWARE\Microsoft\Windows NT\CurrentVersion\drivers.desc

V>могу inf-регистрилку для примера кинуть


Буду премного благодарен: lorelea@e-mail.ru
Re: Audio/Video кодеки - где прописаны в реестре?
От: Motrichuk Alexander Alexandrovich Украина  
Дата: 30.05.03 06:47
Оценка:
Здравствуйте, Mira, Вы писали:

M>Файло кидается в C:\winnt\system32, а в реестре где это прописать, чтобы потом все работало?..


Бросаешь файл в system32, а остальное за тебя сделает ICInstall. Сейчас постараюсь набросать.
На самом деле одной библиотеки достаточно, но некоторые модные кодеки используют внешние файлы фильтров
и допустим managment библиотеки. Их тоже не забудь бросить в system32.
Re[2]: Audio/Video кодеки - где прописаны в реестре?
От: Motrichuk Alexander Alexandrovich Украина  
Дата: 30.05.03 06:52
Оценка:
Здравствуйте, Motrichuk Alexander Alexandrovich, Вы писали:

писал когда то для себя.

BOOL CVideoCodec::IsInstalled(LPCTSTR file_Name)
{
if(!::IsBadReadPtr(file_Name, sizeof(TCHAR)))
{
//типы необходимые для получения информации
//о драйверах для видеодекомпрессии
HIC hic = 0;
//информация куда будем заносить отчет о каждой
//записи в системной таблице зарегистрированных видеокомпрессорах
ICINFO icinfo = {0};

//unicode массивы для разбора fullName драйвера на составляющие
wchar_t drive[_MAX_DRIVE];
wchar_t dir[_MAX_DIR];
wchar_t fname[_MAX_FNAME];
wchar_t ext[_MAX_EXT];

//конвертация ANSI строки в UNICODE
WCHAR fileName[_MAX_DRIVE | _MAX_DIR | _MAX_FNAME | _MAX_EXT] = {0};

#ifdef UNICODE
_tcscpy(fileName, file_Name);
#else
::MultiByteToWideChar(CP_ACP, 0, file_Name, _tcslen(file_Name)+sizeof(TCHAR), fileName, sizeof(fileName)/sizeof(fileName[0]));
#endif

//цикл до тех пор пока в таблице есть декомпрессор с номером i-1
//или пока ICInfo возвращает TRUE
for (int i=0; ICInfo(ICTYPE_VIDEO, i, &icinfo); i++)
{
//открываем компрессор или декомпрессор для получения информации о нем
hic = ICOpen(icinfo.fccType, icinfo.fccHandler, ICMODE_QUERY);
//если мы получили реальный дескриптор компрессора
if(hic)
{
//получение информации о очередном видео декомпрессоре
//при перечислении полного списка
ICGetInfo(hic, &icinfo, sizeof(icinfo));
//-----------------------------------------------------------------------------
//здесь могут какие либо запросы относящиеся к получению необходимой информации
//-----------------------------------------------------------------------------
//очередная информация интересующая нас уже занесена
//в необходимую структуру и сам объект нас более не интересует
ICClose(hic);

//разбор fullName драйвера на составляющие для необходимого сравнения
_wsplitpath(icinfo.szDriver, drive, dir, fname, ext);

//сравниваем имя файла драйвера с переданным буфером
if(!wcscmp(_wcslwr(wcscat(fname, ext)), _wcslwr(fileName)))
{
//вообщем то ниже приведенное абсолютно ненужно, как показали испытания
//операционка сама определяет наличие файла, но меня всегда настораживала 9x
//поэтому учитывая одноразовость операции и ее простоту, я включил и эту проверку следом

//зачем это нужно — если поставить драйвер, а потом случайно удалить ручками файл, что
//бывает, то запрос об существовании драйвера вернет положительный результат, чего не хотелось бы
//этот шаг очень нужен хотя не обязателен. На мой взгляд самый быстрый для проверки существования файла.
//максимально возможный вариант, учитывая локальность — не обременит ресурсами
TCHAR lpszBuf[_MAX_DRIVE | _MAX_DIR | _MAX_FNAME | _MAX_EXT] = {0};
//так функция GetFileAttributes требует в качестве буффера ANSI строку
//а мы имеем имя файла в Unicode формате, то сделаем логическую конвертацию
#ifdef UNICODE
_tcscpy(lpszBuf, icinfo.szDriver);
#else
::WideCharToMultiByte(CP_ACP, 0, icinfo.szDriver, sizeof(icinfo.szDriver)/sizeof(icinfo.szDriver[0]), lpszBuf, _MAX_DRIVE | _MAX_DIR | _MAX_FNAME | _MAX_EXT, NULL, NULL);
#endif

//проверка наличия файла на диске
if(::GetFileAttributes(lpszBuf) != DWORD(-1)) return TRUE;//а все таки драйвер установлен

}//if(!wcscmp(_wcslwr(wcscat(fname, ext)), _wcslwr(fileName)))
} //if(hic)
}//for (int i=0; ICInfo(ICTYPE_VIDEO, i, &icinfo); i++)
}//if(!IsBadReadPtr(libName, sizeof(char)))

//не договорились
return FALSE;
}
Re[2]: Audio/Video кодеки - где прописаны в реестре?
От: Motrichuk Alexander Alexandrovich Украина  
Дата: 30.05.03 07:07
Оценка:
Здравствуйте, Motrichuk Alexander Alexandrovich, Вы писали:

вот минимально необходимый набор для инсталляции в систему DivX последнего. Остальное можно по желанию наворачивать.

#define VIDC mmioFOURCC('v', 'i', 'd', 'c')
#define DIVX mmioFOURCC('d', 'i', 'v', 'x')

TCHAR _tcFileNameBuf[MAX_PATH] = {0};

//divx.dll------------------------------------------------------------------------------
::CopyFile(Divx.dll file from my directory, _TEXT("c:\\winnt\\system32\\divx.dll"), FALSE);
::ICInstall(VIDC, DIVX, (LPARAM)_TEXT("\\divx.dll"), NULL, ICINSTALL_DRIVER); //[VIDC] [DIVX]
::CopyFile(divxdec.ax file from my directory, _TEXT("c:\\winnt\\system32\\divxdec.ax"), FALSE);
::CopyFile(PSIKey.dll file from my directory, _TEXT("c:\\winnt\\system32\\PSIKey.dll"), FALSE);

//регистрируем COM сервер
typedef HRESULT (__stdcall *DLL_REGISTER_SERVER)(void);
DLL_REGISTER_SERVER fn_dllRegisterServer = NULL;

//это в принципе и все действия, полезные которые необходимы для регистрации COM сервера
HMODULE hModule = ::LoadLibrary(_TEXT("divx.dll"));
if(hModule != NULL) fn_dllRegisterServer = (DLL_REGISTER_SERVER)::GetProcAddress(hModule, "DllRegisterServer");
if(fn_dllRegisterServer != NULL)
{
(*fn_dllRegisterServer)();
FreeLibrary(hModule);
}

//можно регистрацию в принципе и опустить. мне почему то кажется, что он self registering
Re[2]: Audio/Video кодеки - где прописаны в реестре?
От: Motrichuk Alexander Alexandrovich Украина  
Дата: 30.05.03 07:16
Оценка:
Здравствуйте, Motrichuk Alexander Alexandrovich, Вы писали:

вообще на сегодняшний день API описывает практически все возможные интерфейсы для
управления приложениями и использования возможностей Windows, а прямое использование
реестра — это ИМХО игра в прятки с Майкрософтом и он кстати не обещает, поддержку совместимости
в последующих версиях относительно реестра. Поэтому я уже давно себя приучил пользоваться
реестром только в случае ядерной войны и то с оговорками. За все время работы не помню, чтобы
в стандартных случаях приходилось когда либо пользоваться. Вообщем все, что можно найти в интерфейсе
настройки Windows обязательно описано в Windows API layer.

Удачи.
Re[3]: Audio/Video кодеки - где прописаны в реестре?
От: Mira  
Дата: 11.01.05 14:52
Оценка:
Здравствуйте, Motrichuk Alexander Alexandrovich, Вы писали:

MAA>Удачи.


Спасибо, вроде теперь все понятно!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.