Регистрация DirectshowFilter связывает запись реестра InprocServer32 с regsvr32.exe вместо хоста DLL, где я ошибся? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть фильтр DirectShow ( MonogramAAC encoder ), успешно компилируемый.Он также успешно регистрируется, однако, когда я пытаюсь создать экземпляр фильтра в GrapheditPlus, он показывает CO_E_ERRORINDLL.После проверки свойств фильтра в GraphEditPlus фильтр фактически был связан с RegSvr32.exe вместо действительной библиотеки DLL хоста!

Вот доказательство:

enter image description here

enter image description here

Я уверен, что файл .def в компоновщике правильный, я также проверял, что он рассматриваетсякомпилятор и он правильно указывает на фильтр DLL.

Небольшая информация о bakground:

Мне не удалось заставить исходный проект компилироваться в Visual Studio 2017 после автоматического преобразования. (Мне не удалось устранить странные ошибки компоновщика библиотеки MFC и среды выполнения между фильтром Monogram и библиотекой libaac.lib, которые я также могу успешно компилировать) .

Наконец-то я решил воссоздать новый проект VS2017, имитирующий оригинальный, и получил его для компиляции и регистрации (единственное предупреждение - несоответствие между именем проекта и выходной библиотекой), но, очевидно, я пропустилчто-то важное при воссоздании проекта.

Есть указатели?

1 Ответ

0 голосов
/ 11 октября 2018

Хорошо, мне удалось найти причину этого неожиданного поведения в этом старом сообщении .

RegSvr32 просто вызывает точку входа DllRegisterServer в вашем коде.То, что записывается в реестр, полностью зависит от вашего фильтра. Если вы используете стандартный вызов базового класса для AMovieDllRegisterServer2 в качестве DllRegisterServer, я подозреваю, что что-то пошло не так при настройке g_hInst, что должно было быть сделано вызовом DllEntryPoint в вашем DllMain .

DllMain не вызывается, поэтому g_hInst остается равным 0, а GetModuleFileNameA (...) возвращает имя текущей исполняемой программы вместо моего фильтра.

Фильтр использует MFC (динамически связанный), а его версия DllMain() не вызывает функцию DllEntryPoint().Мне пришлось переопределить MFC DllMain (), добавив extern "C" { int _afxForceUSRDLL; }, как описано в , ответ на этот вопрос и самому позвонить DllEntryPoint(), чтобы решить проблему с регистрацией.(Я также обнаружил, что отсутствующая #define была причиной того, что страница свойств не появилась).

...