Как самостоятельно зарегистрировать "quartz.dll"? - PullRequest
0 голосов
/ 28 мая 2018

Зарегистрируйте COM, который в основном regsvr32.exe, но мне нужно написать собственный код для регистрации quartz.dll.Поэтому я написал следующий код:

typedef HRESULT(WINAPI *FREG)();

BOOL Register()
{
    CoInitialize(NULL);
    HMODULE hMod = ::LoadLibrary(L"C:/windows/sysWow64/quartz.dll");
    if (!hMod)
        return FALSE;

    HRESULT hResult = ::OleInitialize(NULL);
    if (hResult != S_OK)
    {
        ::FreeLibrary(hMod);
        return FALSE;
    }

FREG lpfunc = (FREG)::GetProcAddress(hMod, "DllRegisterServer");
if (!lpfunc)
{
    ::FreeLibrary(hMod);
    ::OleUninitialize();
    return FALSE;
}

hResult = lpfunc();
::OleUninitialize();
::FreeLibrary(hMod);

return (hResult == S_OK);
}

, но lpfunc () получил E_ACCESSDENIED Ошибка общего доступа запрещена.Я включил UAC для requireAdministrator ,, но ничего не изменилось.

Интересно, что приведенный выше код хорошо работает в консольной программе, и в MFC все еще возникают проблемы с разрешениями. Я нашел много информации, но проблема не быларешено.

1 Ответ

0 голосов
/ 28 мая 2018

Прежде всего, вы обычно не хотите регистрировать quartz.dll.В некоторых редких случаях это действительно позволяет исправить некоторые проблемы (особенно связанные с удалением неточно сделанного пакета кодеков).К счастью, при перерегистрации также нет никакого вреда.

Код является правильным, за исключением того, что OleInitialize не является действительно необходимым.Непривилегированное приложение не может писать под HKLM и, следовательно, ошибка E_ACCESSDENIED.Если уровень UAC понижен, чтобы пользователи не могли подтверждать выполнение приложений requireAdministrator, вам все равно придется «запускаться от имени администратора» в последних ОС, иначе реестр останется только для чтения для вашего приложения и для DLL, которую вы просите выполнить.регистрация.

Итог, это все еще о безопасности и UAC.

...