现在用win7,win8的人越来越多了, 程序在一些 win 7, win8 上运行会遇到一些之前没想过的兼容性问题。

比如 64位系统运行32位程序时的注册表重定向,还有因为 uac (用户帐户控制)注册表的重定向等。

ImageMagick 在安装的时候,相关数据写在 HKEY_LOCAL_MACHINE 下面, 这在 xp 系统下,一般不会出什么问题。

但由于在 win7,win8上,由于64位系统或uac的问题,导致注册表的路径重定向, 特别是 uac 问题,要想将数据保存到HKEY_LOCAL_MACHINE 必须要管理员身份运行软件。

经过一天多时间研究,一开始在网上找到一个办法,通过修改 ImageMagick 的环境变量,因为根据ImageMagick的源代码,module.c (537行)

static MagickBooleanType GetMagickModulePath(const char *filename,

MagickModuleType module_type,char *path,ExceptionInfo *exception)

{

char

*module_path;

assert(filename != (const char *) NULL);

(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);

assert(path != (char *) NULL);

assert(exception != (ExceptionInfo *) NULL);

(void) CopyMagickString(path,filename,MaxTextExtent);

module_path=(char *) NULL;

switch (module_type)

{

case MagickImageCoderModule:

default:

{

(void) LogMagickEvent(ModuleEvent,GetMagickModule(),

"Searching for coder module file \"%s\" ...",filename);

module_path = GetEnvironmentValue("MAGICK_CODER_MODULE_PATH");

#if defined(MAGICKCORE_CODER_PATH)

if (module_path == (char *) NULL)

module_path=AcquireString(MAGICKCORE_CODER_PATH);

#endif

一开始,我在程序开头加了一句:putenv("MAGICK_CODER_MODULE_PATH=c:\\imagemagick\\modules\\coders\\"); //设置环境变量

我以为这样设置后,ImageMagick就不会对注册表有依赖了,可谁知:

printf("MAGICK_CODER_MODULE_PATH:%s\n", getenv("MAGICK_CODER_MODULE_PATH")); //在我的程序中能正常显示的路径

但是 GetEnvironmentValue("MAGICK_CODER_MODULE_PATH"); 返回的是 (null)

我查看了 ImageMagick 的源代码,发现 GetEnvironmentValue() 其实调用的就是 putenv()

可为什么返回的是  null ? 测试发现使用 putenv("MAGICK_CODER_MODULE_PATH=..."); 一点用没有。

再继续研究ImageMagick源代码:

module.c (634行)

#if defined(MAGICKCORE_WINDOWS_SUPPORT)

{

const char

*registery_key;

unsigned char

*key_value;

/*

Locate path via registry key.

*/

switch (module_type)

{

case MagickImageCoderModule:

default:

{

registery_key="CoderModulesPath";

break;

}

case MagickImageFilterModule:

{

registery_key="FilterModulesPath";

break;

}

}

key_value=NTRegistryKeyLookup(registery_key);

if (key_value == (unsigned char *) NULL)

{

ThrowMagickException(exception,GetMagickModule(),ConfigureError,

"RegistryKeyLookupFailed","`%s'",registery_key);

return(MagickFalse);

}

-------------------------------------------------------------------------------

nt-base.c (1813行)

MagickPrivate unsigned char *NTRegistryKeyLookup(const char *subkey)

{

char

package_key[MaxTextExtent];

DWORD

size,

type;

HKEY

registry_key;

LONG

status;

unsigned char

*value;

/*

Look-up base key.

*/

(void) FormatLocaleString(package_key,MaxTextExtent,"SOFTWARE\\%s\\%s\\Q:%d",

MagickPackageName,MagickLibVersionText,MAGICKCORE_QUANTUM_DEPTH);

(void) LogMagickEvent(ConfigureEvent,GetMagickModule(),"%s",package_key);

registry_key=(HKEY) INVALID_HANDLE_VALUE;

status=RegOpenKeyExA(HKEY_LOCAL_MACHINE,package_key,0,KEY_READ,&registry_key);

if (status != ERROR_SUCCESS)

status=RegOpenKeyExA(HKEY_CURRENT_USER,package_key,0,KEY_READ,

&registry_key);

if (status != ERROR_SUCCESS)

{

registry_key=(HKEY) INVALID_HANDLE_VALUE;

return((unsigned char *) NULL);

}

-------------------------------------------------------------------------------------

原来 ImageMagick 搜索注册表的路径有个顺序,先搜索 HKEY_LOCAL_MACHINE, 再搜索 HKEY_CURRENT_USER

看到这里,我想到一个办法,由于 uac 的问题导致普通用户无法写入设置 HKEY_LOCAL_MACHINE,但可以设置 HKEY_CURRENT_USER

只需将相关的数据写入到 HKEY_CURRENT_USER, 这样就不需要管理员身份也能正常的运行了。

经过测试,验证了我的这个想法,问题终于解决了,以后不用烦在 win7,win8上的兼容性问题了。

2014-09-19

ImageMagick: win7 | win8 & uac (用户帐户控制) 注册表的一些事的更多相关文章

  1. 用户“*****”不具有所需的权限。请验证授予了足够的权限并且解决了 Windows 用户帐户控制(UAC)限制问题。

    错误: 用户“ts\***”不具有所需的权限.请验证授予了足够的权限并且解决了 Windows 用户帐户控制(UAC)限制问题. 解决: 当从客户端用IE连接http://xxx.xxx.xxx.xx ...

  2. BAT-把当前用户以管理员权限运行(用户帐户控制:用于内置管理员帐户的管理员批准模式)

    相关资料: http://jingyan.baidu.com/article/72ee561a5dc24fe16138df95.html 网友求助:联想Y400,Win8系统 怎样获得管理员身份 要求 ...

  3. 浅谈Windows用户帐户控制(User Account Control,UAC)

    Microsoft一个事实:大多数用户都用一个Administrator(管理员)帐户来登录Windows.利用这个帐户,用户几乎没有任何限制地访问重要的系统资源,因为该帐户被授予很高的权限.一旦用户 ...

  4. 不出现用户帐户控制-让Win7的用户账户控制(UAC)放过信任的程序

    微软有个官方工具 Microsoft Application Compatibility Toolkit: http://www.microsoft.com/downloads/details.asp ...

  5. 用户“Michael-PC\Michael”不具有所需的权限。请验证授予了足够的权限并且解决了 Windows 用户帐户控制(UAC)限制问题。

    解决方法:在注册表增加键值 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System] 新建-选择“D ...

  6. Windows Vista for Developers——第四部分:用户帐号控制(User Account Control,UAC)

    作者:Kenny Kerr 翻译:Dflying Chen 原文:http://weblogs.asp.net/kennykerr/archive/2006/09/29/Windows-Vista-f ...

  7. [内网渗透]Windows中的用户帐户与组账户

    0x01 用户帐户 1.1 简介        用户帐户是对计算机用户身份的标识,本地用户帐户.密码存在本地计算机上,只对本机有效,存储在本地安全帐户数据库 SAM 中.        文件路径:C: ...

  8. linux基础命令--userdel 删除用户帐户和相关文件

    描述 userdel命令用于删除用户帐户和相关文件. userdel命令修改系统账户文件,删除所有涉及用户的信息,指定的用户(LOGIN)必须存在. 语法 userdel [options] LOGI ...

  9. usermod - linux修改用户帐户信息

    usermod - 修改用户帐户信息 modify a user account usermod [options] user_name usermod 命令修改系统帐户文件来反映通过命令行指定的变化 ...

随机推荐

  1. shell中的>,2>&1,&>file 解析记录

    0  表示标准输入1  表示标准输出2  表示标准错误输出>  默认为标准输出重定向,与 1> 相同2>&1  意思是把 标准错误输出 重定向到 标准输出.&> ...

  2. MyBatis基础:MyBatis入门(1)

    1. MyBatis简介 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyBatis ...

  3. centos7优化启动项,关闭一些不必要开启的服务

    CentOS7已不再使用chkconfig 管理启动项 使用 systemctl list-unit-files 可以查看启动项 systemctl list-unit-files | grep en ...

  4. FMC

    FMC (FPGA Mezzanine Card) 编辑 FMC:英文全称,FPGA Mezzanine Card.是一个应用范围.适应环境范围和市场领域范围都很广的通用模块.FMC连接器(FMC C ...

  5. caffemodel模型

    resnet18 https://github.com/HolmesShuan/ResNet-18-Caffemodel-on-ImageNet

  6. BZOJ 1800 [Ahoi2009]fly 飞行棋

    题目链接 思路 终于有一道自己想出来的题了,开心. 因为是矩形,一定有直角,所以考虑直径,之后由于矩形对角线是两条直径,所以考虑组合数. 直径有n条,矩形有c(n,2)个. #include<i ...

  7. Codeforces 714A 朋友聚会

    参考自:https://www.cnblogs.com/ECJTUACM-873284962/p/6395268.html A. Meeting of Old Friends time limit p ...

  8. SQL Server查询优化器的工作原理

    SQL Server的查询优化器是一个基于成本的优化器.它为一个给定的查询分析出很多的候选的查询计划,并且估算每个候选计划的成本,从而选择一个成本最低的计划进行执行.实际上,因为查询优化器不可能对每一 ...

  9. F. Asya And Kittens 并查集维护链表

    reference :https://www.cnblogs.com/ZERO-/p/10426473.html

  10. Codeforces Round #518 (Div. 2) B. LCM gcd+唯一分解定律

    题意:给出b 求lcm(a,b)/a 在b从1-1e18有多少个不同得结果 思路lcm*gcd=a*b  转换成    b/gcd(a,b) 也就是看gcd(a,b)有多少个值  可以把b 由唯一分解 ...