如何自己注册“quartz.dll”?

时间:2018-05-28 12:06:49

标签: c++ directshow

注册一个主要是regsvr32.exe的COM,但是我需要将自己的代码写入Register 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 :(得分:1)

首先,您通常不想注册quartz.dll。在一些罕见的情况下,它确实允许修复某些问题(特别是与卸载不准确的编解码器包有关)。幸运的是,重新注册也没有坏处。

代码是正确的,只是OleInitialize不是必需的。非特权应用程序无法在HKLM下编写,因此E_ACCESSDENIED失败。如果您将UAC级别降低到不提示用户确认requireAdministrator应用程序的执行,您仍然必须在最近的操作系统中“以管理员身份运行”,否则注册表仍然只读取您的应用程序和您要求的DLL做注册。

最重要的是,它仍然是关于安全性和UAC。