Здравствуйте, sprf, Вы писали:
S>CoInitializeEx() завершается успешно. S>CoCreateInstance() возвращает ошибку regdb_e_classnotreg. GetLastError() непосредственно после вызова CoCreateInstance() возвращает — 1008 "Попытка ссылки на несуществующий маркер.
S>Операционка Win7 — 64. Среда VS-6.
S>В чем может быть причина?
// MessageId: REGDB_E_CLASSNOTREG
//
// MessageText:
//
// Class not registered
//#define REGDB_E_CLASSNOTREG _HRESULT_TYPEDEF_(0x80040154L)
Основная причина — компонент, в твоём случае CLSID_FilterGraph, не зарегистрирован в Реестре. Как физически, так и логически. Например, сервера под 64 бита нет в Реестре, а есть только под 32 бита. Или наоборот.
Vi2>// MessageId: REGDB_E_CLASSNOTREG
Vi2>//
Vi2>// MessageText:
Vi2>//
Vi2>// Class not registered
Vi2>//
Vi2>#define REGDB_E_CLASSNOTREG _HRESULT_TYPEDEF_(0x80040154L)
Vi2>
Vi2>Основная причина — компонент, в твоём случае CLSID_FilterGraph, не зарегистрирован в Реестре. Как физически, так и логически. Например, сервера под 64 бита нет в Реестре, а есть только под 32 бита. Или наоборот.
Благодарю за ответ конечно, но это и так понятно что компонет отсутствует судя по ошибке. Но дело в том, что этот FilterGraph является исходным для построения любых графов в системе DirectShow и содержит в себе базисные подынтерфейсы управления этими графами. Если бы он действительно отсутсвовал, то это по крайней мере было бы очень сильно заметно по работе системы. А так все остальные приложения, использующие эти же принципы, нормально работают (и 32 битные и 64 битные).
Здравствуйте, sprf, Вы писали:
S>Благодарю за ответ конечно, но это и так понятно что компонет отсутствует судя по ошибке. Но дело в том, что этот FilterGraph является исходным для построения любых графов в системе DirectShow и содержит в себе базисные подынтерфейсы управления этими графами. Если бы он действительно отсутсвовал, то это по крайней мере было бы очень сильно заметно по работе системы. А так все остальные приложения, использующие эти же принципы, нормально работают (и 32 битные и 64 битные).
И тем не менее, в твоём коде нет ничего настораживающего или с необходимостью приводящего к ошибкам. Это обычный, написанный в тысячах программ, код. Если он сбивается, то, значит, дело не в нём, а во внешних обстоятельствах. Возможно, ты не проверял эти "нормально работающие (и 32 битные и 64 битные)". Может, прав нет на доступ к Реестру и на запуск сервера.
CoCreateInstance
...
Return Values S_OK — An instance of the specified object class was successfully created. REGDB_E_CLASSNOTREG — A specified class is not registered in the registration database. Also can indicate that the type of server you requested in the CLSCTX enumeration is not registered or the values for the server types in the registry are corrupt.
S>CoInitializeEx() завершается успешно. S>CoCreateInstance() возвращает ошибку regdb_e_classnotreg. GetLastError() непосредственно после вызова CoCreateInstance() возвращает — 1008 "Попытка ссылки на несуществующий маркер.
S>Операционка Win7 — 64. Среда VS-6.
S>В чем может быть причина?
Дело в том, что интерфейс IGraphBuilder является локальным (помечен словом local в IDL). Это означает, что данный интерфейс не может маршалиться между апартаментами. Вы пытаетесь создать объект, находясь в STA (COINIT_APARTMENTTHREADED). А все компоненты DirectShow предназначены для работы в MTA.
Вам надо поставить COINIT_MULTITHREADED в CoInitializeEx.
Здравствуйте, john_silver, Вы писали:
_>Дело в том, что интерфейс IGraphBuilder является локальным (помечен словом local в IDL). Это означает, что данный интерфейс не может маршалиться между апартаментами. Вы пытаетесь создать объект, находясь в STA (COINIT_APARTMENTTHREADED). А все компоненты DirectShow предназначены для работы в MTA.
_>Вам надо поставить COINIT_MULTITHREADED в CoInitializeEx.
Это можно проверить, т.к. мой Реестр говорит, что эта серверная длл имеет все апартменты. Если IID_IGraphBuilder заменить на IID_IUnknown, тогда если ошибка исчезнет, то прав john_silver, т.к. маршаллинг даётся системой.
Я собственно про эти обстоятельства и спрашиваю. Что это может быть? Код действительно абсолютно рабочий да и изъезженный мной раз сто. Но на одной машине внезапно отказался работать. Зато остальные программы также юзающие DirectShow работают и выполняют свои основные функции. А куда им без CoCreateInstance(CLSID_FilterGraph...)?
Про привелегии думал. Попробовал запустить как службу от имени локал-систем. Результат тот же...
В реестре HKEY_CLASSES_ROOT\CLSID\{E436EBB3-524F-11CE-9F53-0020AF0BA770} присутствует. Файл quartz.dll также присутствует.