c++ - 如何自己注册“quartz.dll”?
问题描述
注册一个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 以要求管理员,但没有任何改变。
有趣的是,上面的代码在控制台程序中运行良好,在MFC中仍然存在权限问题。我查了很多资料,但问题没有解决。
解决方案
首先,您通常不想注册quartz.dll。在极少数情况下,它确实允许修复某些问题(特别是与卸载不准确制作的编解码器包有关)。幸运的是,重新注册也没有坏处。
代码几乎是正确的,但OleInitialize
实际上并不是必需的。非特权应用程序无法在 HKLM 下写入,因此E_ACCESSDENIED
失败。如果您将 UAC 级别降低到不提示用户确认requireAdministrator
应用程序的执行,您仍然必须在最近的操作系统中“以管理员身份运行”,否则注册表仍然对您的应用程序和您要求进行注册的 DLL 保持只读状态。
归根结底,它仍然是关于安全性和 UAC 的。
推荐阅读
- javascript - 如何使用 Gatsby.js 在 Markdown 中实现 gatsby-remark-images-grid
- javascript - 二维数组[对象,对象]
- node.js - Laravel Mix HMR 编译后不更新
- after-effects - 在 After Effects 中堆叠和平衡形状?
- ocaml - 从列表中删除给定位置的元素
- javascript - 如何在angulajs中添加间隔时间。?
- vb.net - 消除多行字符串中的重复项
- c# - 使用 [Authorize] 时的 System.Web.HttpException
- javascript - 如何在 IE 中散焦下拉菜单?(AngularJS)
- mysql - 是否可以将多个数据库表作为输入传递给mysql中的存储过程