ATL ActiveX 非管理员权限发布(支持vs2005)
在win7系统中,vs2005开发的atl activex需要管理员权限才能注册。
解决方法:
PerUserRegistration.h
#pragma once class PerUserRegistration
{
public:
PerUserRegistration(bool perUser = true);
~PerUserRegistration(); private:
#if _ATL_VER < 0x0900
static void EnablePerUserTLibRegistration();
bool m_mapping;
#endif
};
#include "PerUserRegistration.h"
#include <Windows.h>
#include <assert.h> PerUserRegistration::PerUserRegistration(bool perUser)
#if _ATL_VER < 0x0900
: m_mapping(false)
#endif
{
#if _ATL_VER < 0x0900
// this seems to be always active and therefore may break
// any COM functionality thats not registered per user if (!perUser)
{
return;
} HKEY key; LONG err = ::RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Classes"), , MAXIMUM_ALLOWED, &key);
if(err == ERROR_SUCCESS) {
err = ::RegOverridePredefKey(HKEY_CLASSES_ROOT, key);
::RegCloseKey(key);
} if (err == ERROR_SUCCESS) {
EnablePerUserTLibRegistration();
m_mapping = true;
}
#else // _ATL_VER >= 0900
AtlSetPerUserRegistration(perUser);
#endif
} #if _ATL_VER < 0x0900
void PerUserRegistration::EnablePerUserTLibRegistration()
{
HMODULE hOleaut32 = ::GetModuleHandle(TEXT("Oleaut32.dll"));
assert(hOleaut32); typedef void (WINAPI * EnablePerUserTLibRegistrationProcPtr) (void);
EnablePerUserTLibRegistrationProcPtr enablePerUserTLibRegistrationProcPtr =
reinterpret_cast<EnablePerUserTLibRegistrationProcPtr>(
GetProcAddress(hOleaut32, "OaEnablePerUserTLibRegistration"));
if (enablePerUserTLibRegistrationProcPtr) {
enablePerUserTLibRegistrationProcPtr();
}
}
#endif PerUserRegistration::~PerUserRegistration()
{
#if _ATL_VER < 0x0900
if (m_mapping)
::RegOverridePredefKey(HKEY_CLASSES_ROOT, NULL);
#endif
}
然后在ActiveX程序中使用:
// DllRegisterServer - 将项添加到系统注册表
STDAPI DllRegisterServer(void)
{
PerUserRegistration perUser(true); // 注册对象、类型库和类型库中的所有接口
HRESULT hr = _AtlModule.DllRegisterServer();
#ifdef _MERGE_PROXYSTUB
if (FAILED(hr))
return hr;
hr = PrxDllRegisterServer();
#endif
return hr;
} // DllUnregisterServer - 将项从系统注册表中移除
STDAPI DllUnregisterServer(void)
{
PerUserRegistration perUser(true); HRESULT hr = _AtlModule.DllUnregisterServer();
#ifdef _MERGE_PROXYSTUB
if (FAILED(hr))
return hr;
hr = PrxDllRegisterServer();
if (FAILED(hr))
return hr;
hr = PrxDllUnregisterServer();
#endif
return hr;
}
这样就可以了,不是管理员也可以正常注册使用了。
ATL ActiveX 非管理员权限发布(支持vs2005)的更多相关文章
- windows7安装phpnow Apache非管理员权限不能操作Windows NT服务的解决方法
科普一下:PHPnow 是什么? Win32 下绿色免费的 Apache + PHP + MySQL 环境套件包.简易安装.快速搭建支持虚拟主机的 PHP 环境,可以安装 Discuz! ...
- 用非管理员权限启动主程序,并用管理员权限启动子程序,导致WM_COPYDATA消息发送失败的问题
问题描述 : 用非管理员权限启动dzh,dzh再启动dtssm,由于dtssm的配置文件app.manifest 中设置了requireAdministrator,导致dtssm总是以管理员权 ...
- windows下非管理员权限安装mysql
windows下,mysql有两种安装方式: 1.msi安装 2.zip安装 无论是哪种安装方式,都因为需要将mysql安装为一个服务,所以必须要以管理员权限安装. 因为公司的换了虚拟机,无法取得管理 ...
- Vista UAC下应用程序标注为“需要管理员权限”的四种方法
在Microsoft 的UACBlog里对此有过叙述.总结如下: 首先,如果一个程序被识别为管理员程序时,Vista会在它的图标上加上一个盾牌标记.因此很容易看出来. 其次,如果UAC有效的话,管理员 ...
- C#以管理员权限运行源码,C#软件获取管理员权限,c#获取管理员权限
C#以管理员权限运行源码,C#软件获取管理员权限,c#获取管理员权限 发布时间:2014-10-19 21:40内容来源:未知 点击: 次 windows 7和vista提高的系统的安全性,同时需要明 ...
- Win7,Vista UAC下应用程序标注为“需要管理员权限”的四种方法(可以修改注册表)
[转]Vista UAC下应用程序标注为“需要管理员权限”的四种方法 在Microsoft 的UACBlog里对此有过叙述.总结如下: 首先,如果一个程序被识别为管理员程序时,Vista会在它的图标上 ...
- c# 如何获取系统管理员权限(UAC) 及判断当前是否是管理员权限
环境说明: VS2012,windows 7 亲自验证过win7 和xp ,XP直接不弹框,因为XP没有UAC控制机制 步骤1: 右键项目-->属性-->安全性-->选中[启用Cl ...
- vs2005 ,2008,2010中引入app.manifest(即c#程序在win7下以管理员权限运行方法)
打开VS2005.VS2008.VS2010工程,查看工程文件夹中的Properties文件夹下是否有app.manifest这个文件:如没有,按如下方式创建:鼠标右击工程在菜单中选择“属性”,点击工 ...
- wordpress非管理员看不到数据需有manage_options权限
今天ytkah在调试一个新功能的时候发现wordpress非管理员看不到一些插件的数据,比如editor,添加一些用户权限还是不行,不得已直接把administrator所有的权限都添加测试一遍,最后 ...
随机推荐
- OpenGL中的深度、深度缓存、深度测试及保存成图片
1.深度 所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离.摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机. 2.深度缓冲区 深度缓冲区原理就 ...
- 【BZOJ3270】【高斯消元】博物馆
Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n间房间,并且满足可以从任何一 ...
- ScrollView 尽量避免嵌套RelativeLayout,非常惨痛的教训
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...
- 菜鸟的MySQL学习笔记(五)
7.自定义函数 用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同.包含了两个必要条件,参数与返回值.没有必然内在联系. 函数可以返 ...
- shell通过ftp实现上传/下载文件
直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...
- 将yyyyMMdd HH:mm:ss格式的时间转换成时间类型
DateTime.ParseExact(gmt_withdrawal, "yyyyMMddHHmmss", System.Globalization.CultureInfo.Cur ...
- aspose.cells根据模板导出excel
又隔十多天没写博客了,最近都在忙项目的事情,公司人事变动也比较大,手头上就又多了一个项目.最近做用aspose.cells根据模板导出excel报价单的功能,顺便把相关的核心记下来,先上模板和导出的效 ...
- C# 两时间,时间间隔
#region 返回时间差 public static string DateDiff(DateTime DateTime1, DateTime DateTime2) { ...
- SimpleMembership: The future of membership for ASP.NET
http://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal- ...
- 解决nginx 504 Gateway Time-out的一些方法
在CentOS下配置lnmp组合基本上用的都是同样的配置文件,一直都没出现过问题,可最近在一个vps上安装同样的环境之后,网站在线10多人就出 现了打开速度非常缓慢的情况,有好几次都是直接达到了ngi ...