在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)的更多相关文章

  1. windows7安装phpnow Apache非管理员权限不能操作Windows NT服务的解决方法

    科普一下:PHPnow 是什么?        Win32 下绿色免费的 Apache + PHP + MySQL 环境套件包.简易安装.快速搭建支持虚拟主机的 PHP 环境,可以安装 Discuz! ...

  2. 用非管理员权限启动主程序,并用管理员权限启动子程序,导致WM_COPYDATA消息发送失败的问题

    问题描述 :     用非管理员权限启动dzh,dzh再启动dtssm,由于dtssm的配置文件app.manifest 中设置了requireAdministrator,导致dtssm总是以管理员权 ...

  3. windows下非管理员权限安装mysql

    windows下,mysql有两种安装方式: 1.msi安装 2.zip安装 无论是哪种安装方式,都因为需要将mysql安装为一个服务,所以必须要以管理员权限安装. 因为公司的换了虚拟机,无法取得管理 ...

  4. Vista UAC下应用程序标注为“需要管理员权限”的四种方法

    在Microsoft 的UACBlog里对此有过叙述.总结如下: 首先,如果一个程序被识别为管理员程序时,Vista会在它的图标上加上一个盾牌标记.因此很容易看出来. 其次,如果UAC有效的话,管理员 ...

  5. C#以管理员权限运行源码,C#软件获取管理员权限,c#获取管理员权限

    C#以管理员权限运行源码,C#软件获取管理员权限,c#获取管理员权限 发布时间:2014-10-19 21:40内容来源:未知 点击: 次 windows 7和vista提高的系统的安全性,同时需要明 ...

  6. Win7,Vista UAC下应用程序标注为“需要管理员权限”的四种方法(可以修改注册表)

    [转]Vista UAC下应用程序标注为“需要管理员权限”的四种方法 在Microsoft 的UACBlog里对此有过叙述.总结如下: 首先,如果一个程序被识别为管理员程序时,Vista会在它的图标上 ...

  7. c# 如何获取系统管理员权限(UAC) 及判断当前是否是管理员权限

    环境说明: VS2012,windows 7  亲自验证过win7 和xp ,XP直接不弹框,因为XP没有UAC控制机制 步骤1: 右键项目-->属性-->安全性-->选中[启用Cl ...

  8. vs2005 ,2008,2010中引入app.manifest(即c#程序在win7下以管理员权限运行方法)

    打开VS2005.VS2008.VS2010工程,查看工程文件夹中的Properties文件夹下是否有app.manifest这个文件:如没有,按如下方式创建:鼠标右击工程在菜单中选择“属性”,点击工 ...

  9. wordpress非管理员看不到数据需有manage_options权限

    今天ytkah在调试一个新功能的时候发现wordpress非管理员看不到一些插件的数据,比如editor,添加一些用户权限还是不行,不得已直接把administrator所有的权限都添加测试一遍,最后 ...

随机推荐

  1. 贪心算法:旅行商问题(TSP)

    TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出.问题描述如下: 有若干个城市,任何两个城市之间 ...

  2. 如何查看MySQL中每张表占用的空间大小

    如题,找到MySQL中的information_schema表,这张表记录了所有数据库中表的信息,主要字段含义如下: TABLE_SCHEMA : 数据库名 TABLE_NAME:表名 ENGINE: ...

  3. ionic移动开发入门

    学习资料:http://www.ionic.wang http://www.ionicframework.com/

  4. iphone 与 ipad -- UIPopoverPresentationViewController

    iOS8.0之后, 苹果推出了UIPopoverPresentationViewController, 在弹出控制器时, 统一采用 presentViewController, 但是要实现iPhone ...

  5. iOS - 应用程序国际化

    开发的移动应用更希望获取更多用户,走向世界,这就需要应用国际化,国际化其实就是多语言.这篇文章介绍Xcode4.5以后的国际化,包括应用名国际化和应用内容国际化.如果是Xcode4.5之前版本请参考. ...

  6. 基于opencv的小波变换

    基于opencv的小波变换 提供函数DWT()和IDWT(),前者完成任意层次的小波变换,后者完成任意层次的小波逆变换.输入图像要求必须是单通道浮点图像,对图像大小也有要求(1层变换:w,h必须是2的 ...

  7. 【JavaScript】JavaScript函数的参数

    要访问js函数中传入的所有参数,可以使用特殊的arguments变量.但是虽然可以像访问数组一样从arguments变量中读取参数,但arguments并非真正的数组.例如,arguments没有pu ...

  8. Android 连接tomcat模拟登陆账号

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  9. 如何取消Linux下,vi中显示的^M符号

    http://www.cnblogs.com/dkblog/archive/2012/02/03/2337187.html dos2unix file_name bash: ./configure: ...

  10. [转贴]JAVA 百度地图SDK地图学习——实现定位功能

    之前已经完成了百度地图SDK和百度定位SDK的配置. http://my.oschina.net/u/1051634/blog/180880 实现百度定位的功能,最好仔细看看官方的文档,看了好几次才有 ...