如何自己注册"quartz.dll"?
How to Register "quartz.dll" by myself?
注册一个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,但没有任何改变
有意思的是,上面的代码在console程序中运行良好,在MFC.I找了很多资料还是存在权限问题,但是问题还是没有解决。
首先,您通常不想注册quartz.dll。在极少数情况下,它确实可以修复某些问题(尤其是与卸载不正确制作的编解码器包相关的问题)。幸运的是,重新注册也没有坏处。
除了 OleInitialize
不是真正必要的代码外,该代码几乎是正确的。非特权应用程序无法在 HKLM 下写入,因此 E_ACCESSDENIED
失败。如果您将 UAC 级别降低到不提示用户确认执行 requireAdministrator
应用程序,您仍然需要 "run as administrator" 在最近的操作系统中,否则注册表仍然对您的应用程序和您要求的 DLL 保持只读状态进行注册。
归根结底,它仍然是关于安全和 UAC 的。
注册一个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,但没有任何改变
有意思的是,上面的代码在console程序中运行良好,在MFC.I找了很多资料还是存在权限问题,但是问题还是没有解决。
首先,您通常不想注册quartz.dll。在极少数情况下,它确实可以修复某些问题(尤其是与卸载不正确制作的编解码器包相关的问题)。幸运的是,重新注册也没有坏处。
除了 OleInitialize
不是真正必要的代码外,该代码几乎是正确的。非特权应用程序无法在 HKLM 下写入,因此 E_ACCESSDENIED
失败。如果您将 UAC 级别降低到不提示用户确认执行 requireAdministrator
应用程序,您仍然需要 "run as administrator" 在最近的操作系统中,否则注册表仍然对您的应用程序和您要求的 DLL 保持只读状态进行注册。
归根结底,它仍然是关于安全和 UAC 的。