在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. 【POJ2094】【差分序列】Angry Teacher

    Description Mr. O'Cruel is teaching Math to ninth grade students. Students of course are very lazy, ...

  2. java.util.Map源码分析

    /** * An object that maps keys to values. A map cannot contain duplicate keys; * each key can map to ...

  3. Scala - error: not found: value SortedMap

    先 IMPORT!!!! scala> import scala.collection._import scala.collection._ scala>  SortedMap(" ...

  4. Mantle 简单教程

    Mantle可以很方便的去书写一个模型层的代码. 使用它可以很方便的去反序列化JSON或者序列化为JSON(需要在MTLModel子类中实现<MTLJSONSerializing>协议) ...

  5. centOS 6 python MySQLdb 提示 no module

    http://www.cnblogs.com/czh-liyu/archive/2012/11/30/2796028.html(转) 用python连接本地数据库时,提示no module MySQL ...

  6. yii2源码学习笔记(十八)

    View继承了component,用于渲染视图文件:yii2\base\View.php <?php /** * @link http://www.yiiframework.com/ * @co ...

  7. cmake 安装 mysql

    因为高版本mysql都用cmake安装,另外安装cluster版的mysql也必须通过cmake安装,所以学习cmake安装mysql很有必要. 今天我因为打算搭配一个mysql集群所以,在虚拟机上安 ...

  8. delphi cxgrid导出excel去除货币符号

    版本 : devexpress 13.1.4 打开 包在ExpressExportLibary目录中.  修改FCells.SetCellDataCurrency为FCells.SetCellData ...

  9. HDU1005 数列找规律

    Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1 ...

  10. DSP:CCS V6 TMS320F2812 使用printf函数

    使用Code Composer Studio  Version: 6.1.1.00022,建立TMS320F2812工程. /* * main.c */ #include <stdio.h> ...