//通过查看 ImageMagick 源代码: http://code.metager.de/source/xref/ImageMagick/MagickCore/module.c#552

//首先会查找:  module_path=GetEnvironmentValue("MAGICK_CODER_MODULE_PATH");  也就是 -> getenv("MAGICK_CODER_MODULE_PATH");  读取系统变量

整个测试分两部分, 首先测试通过设置[环境变量]:MAGICK_CODER_MODULE_PATH

//关于修改[环境变量]的说明

//putenv()用来改变或增加环境变量的内容。参数envvar的格式为envvar=value,如果该环境变量原先存在,则变量内容会依参数envvar改变,

//否则此参数内容会成为新的环境变量, 返回值: 执行成功则返回0,有错误发生则返回-1: 无法配置新的环境变量空间

//注意:设置的环境仅对程序本身有效(目测对进程中已经加载的dll也无效)。

//你在程序里做的改变不会反映到外部环境中,这是因为变量的值不会从子进程传播到父进程,这样做更安全。

//但是: 子进程继承父进程的环境变量 (默认情况下,子进程继承父进程环境变量内存块的一份拷贝)

//最后说明: 通过在 xp 和 win8.1 上测试表明:

//在 xp 下测试, 通过设置  MAGICK_CODER_MODULE_PATH (使用完整路径后), 不再需要 SetCurrentDirectory(app_folder_path); 就能正常的加载宝贝图片

//在 win8.1 下测试, 通过设置  MAGICK_CODER_MODULE_PATH (使用完整路径后),  在不使用 SetCurrentDirectory(app_folder_path); 的情况下, 还是发生错误:

//image.c unknow 916 NoDecodeDelegateForThisImageFormat 'JPEG' @ error/constitute.c/ReadImage/501

//从这个结果看, 在程序中设置 环境变量 MAGICK_CODER_MODULE_PATH 没任何意义, 与使用注册表的结果是一样的, 解决不了部分win8.1上只能在英文文件夹中运行软件.

/*

char *pMagickCoderModulePath = getenv("MAGICK_CODER_MODULE_PATH");

if(pMagickCoderModulePath == NULL)

{

char coders_gbk[] = "D:\\soft\\c\\....\\bin\\Release\\modules\\coders";

int coders_gbk_len = strlen(coders_gbk);

int coders_utf8_len = coders_gbk_len * 2;

char coders_utf8[coders_utf8_len];

size_t outedSize;

iconvStr("gbk", "utf-8", coders_gbk, coders_gbk_len, coders_utf8, coders_utf8_len, &outedSize);

char text[4096];

sprintf(text, "MAGICK_CODER_MODULE_PATH=%s", coders_utf8);

//putenv("MAGICK_CODER_MODULE_PATH=modules\\coders");  //也可以使用相对路径, 但必须 SetCurrentDirectory(app_folder_path);

putenv(text);

char exeFilePath[MAX_PATH];

int len = GetModuleFileName(NULL, exeFilePath, MAX_PATH); //Long,如执行成功,返回复制到lpFileName的实际字符数量, 零表示失败。

if(len > 0)

{

printf("exeFilePath:%s\n", exeFilePath);

int status = (int)ShellExecute(NULL, "open", exeFilePath, NULL, NULL, SW_SHOW); //使用默认程序打开

printf("status:%d\n", status);

//system("pause");

exit(0);

}

}

else

{

printf("MAGICK_CODER_MODULE_PATH:%s\n", getenv("MAGICK_CODER_MODULE_PATH"));

}

*/

然后测试通过注册表:

/*

[HKEY_CURRENT_USER\SOFTWARE\ImageMagick\6.8.9\Q:16]

"BinPath"="C:\\ImageMagick"        //经过测试发现: BinPath 参数不必需, 可以没有

"ConfigurePath"="C:\\ImageMagick"  //经过测试发现: ConfigurePath 参数不必需, 可以没有

"LibPath"="C:\\ImageMagick"        //经过测试发现: LibPath 参数不必需, 可以没有

"CoderModulesPath"="C:\\ImageMagick\\modules\\coders"   //经过测试发现: 这个路径要么是相对路径, 如果是绝对路径, 必须是 utf-8编码的

"FilterModulesPath"="C:\\ImageMagick\\modules\\filters" //经过测试发现: 这个路径要么是相对路径, 如果是绝对路径, 必须是 utf-8编码的

*/

//关于 CoderModulesPath 和 FilterModulesPath 参数, 在 xp 下, 使用完整路径(utf-8), 不再需要 SetCurrentDirectory(app_folder_path);

//但是在 win8.1 下测试, 使用完整路径(utf-8) 加载宝贝失败,错误信息:

//UnableToLoadModule 'C:\....\涓诲浘瑙嗛v6.0\modules\coders\IM_MOD_RL_JPEG_.dll:找不到指定的模块 (注: 涓诲浘瑙嗛 其实就是 中文文件夹的 utf-8编码

//这个错误信息看, 在 xp,2003系统下, ImageMagick 在加载dll的时候, 先将 utf-8 编码转换成 gbk, 然后就能能正常加载对应的dll文件

//但在 win8.1 下, 没有对 utf-8编码 进行转码, 直接加载, 导致 dll 找不到

//在 win8.1 下加上 SetCurrentDirectory(app_folder_path);  又能正常的加载宝贝了。

通过两种方式的测试结果可以看出:

ImageMagick 内部加载 coder module 的代码实现是很奇葩的。

不管是通过设置环境变量:MAGICK_CODER_MODULE_PATH,还是注册表项:CoderModulesPath

如果coders 使用经过 utf-8 编码后的完整路径, 在 xp, 2003 下,不需要 SetCurrentDirectory(app_folder_path); 就能正常的加载相关的dll,但是在 win8.1 下,必需  SetCurrentDirectory(app_folder_path);

并且在极少一部分 64位的 win8.1 下, 就算 SetCurrentDirectory(app_folder_path); 也不行,必须把整个软件放在[全是英文文件夹路径]中才能正常的加载dll处理图片。

使用相对路径:modules\coders 结合 SetCurrentDirectory(app_folder_path); 在极少部分64位的win8.1 上还是出现问题,必须存放在[全是英文文件夹路径]中才能正常的加载dll处理图片。

还有一种解决办法:

对 ImageMagick 的源代码进行重新编译,生成一个静态的链接库。

这样有可能会解决所有问题, 但是生成的exe文件会很大,至少 5M+

参考:http://blog.csdn.net/wwwsq/article/details/7352777

2015-04-16

ImageMagick - MAGICK_CODER_MODULE_PATH 测试结果, 很受伤的更多相关文章

  1. iPhone 6 被盗记录二【写在315前夕:苹果售后福州直信创邺在没有三包的情况下帮小偷翻新、助力小偷换机销赃!无视王法。让人震惊,痛心,憎恨!消费者很受伤很无奈】

    投诉公司: 北京直信创邺数码科技有限公司  标题: 写在315前夕:苹果售后在没有三包的情况下帮小偷翻新.助力小偷换机销赃!无视王法.让人震惊,痛心,憎恨!消费者很受伤很无奈 期望: 还我手机,或者赔 ...

  2. 奇虎360选择IPO “壳概念”很受伤

    黄一帆   “市场正呈现出为一幕经典影像:在绚丽的霞光笼罩下,蔚蓝色的大海边,在金色的海岸上,欢笑的孩子们踮起脚尖,刚好看见原来海平面露出的航船桅杆——那是缓缓驶来的注册制号:而转过头来,则是沙滩上大 ...

  3. @常见的远程服务器连接工具:Xshell与secureCRT的比较!!!(对于刚接触的测试小白很有帮助哦)

    现在比较受欢迎的终端模拟器软件当属xshell和securecrt了. XShell绝对首选,免费版也没什么限制,随便改字体随便改颜色随便改大小随便改字符集,多窗口,也比较小巧,而SecureCRT界 ...

  4. 恶意软件"跨平台" 小心钱包很受伤

    什么是跨平台攻击? 举例来说.就像网络诈骗犯为了避开电子商务平台的监控.会在微博上发消息.百度上撒网,腾讯上联系,最后在淘宝上交易.这样的跨平台操作的模式会大大添加犯罪过程监控和取证的难度.而跨平台攻 ...

  5. 功能测试很low?不能升级到高级测试工程师?

    功能测试很low?不能升级到高级测试工程师? 功能测试很low?功能测试很简单?功能测试就是黑盒测试?功能测试没有技术含量?功能测试工资低?只会功能测试没有竞争力?功能测试这活初中生都可以干?功能测试 ...

  6. windows7下php5.4成功安装imageMagick,及解决php imagick常见错误问题。(phpinfo中显示不出来是因为:1.imagick软件本身、php本身、php扩展三方版本要一致,2.需要把CORE_RL_*.dll多个文件放到/php/目录下面)

    windows7下   php5.4成功安装imageMagick . (phpinfo中显示不出来是因为:1.软件本身.php本身.php扩展三方版本要一致,2.需要把CORE_RL_*.dll多个 ...

  7. ImageMagick

    http://blog.csdn.net/lan861698789/article/details/7738383 1.官网 http://www.imagemagick.org/script/ind ...

  8. 从零开始编写自己的C#框架(24)——测试

    导航 1.前言 2.不堪回首的开发往事 3.测试推动开发的成长——将Bug消灭在自测中 4.关于软件测试 5.制定测试计划 6.编写测试用例 7.执行测试用例 8.发现并提交Bug 9.开发人员修复B ...

  9. 关于web端功能测试的测试方向

    一.功能测试 1.1链接测试 链接是web应用系统的一个很重要的特征,主要是用于页面之间切换跳转,指导用户去一些不知道地址的页面的主要手段,链接测试一般关注三点: 1)链接是否按照既定指示那样,确实链 ...

随机推荐

  1. JS --- 本地保存localStorage、sessionStorage用法总结

    JS的本地保存localStorage.sessionStorage用法总结 localStorage.sessionStorage是Html5的特性,IE7以下浏览器不支持 为什么要掌握localS ...

  2. Codeforces 1154F Shovels Shop

    题目链接:http://codeforces.com/problemset/problem/1154/F 题目大意: 商店有n把铲子,欲购k把,现有m种优惠,每种优惠可使用多次,每种优惠(x, y)表 ...

  3. ECharts在柱状图的柱子上方显示数量的方法

    在setOption()方法中的series配置中加上itemStyle配置 如下: series: [{ name: '人数', type: 'bar', data: [], //x轴对应列的值 i ...

  4. SSH本地端口转发的理解

    ssh -L 3307:127.0.0.1:3306 user@ssh-server -N 其中127.0.0.1:3306是指 ssh-server要访问资源的ip和端口 而3307则是隧道的开口, ...

  5. jq的$.each()方法

    jq的$.each()方法: 语法:jQuery.each(object, [callback]) 回调函数拥有两个参数:第一个为对象的成员或数组的索引,第二个为对应变量或内容.如果需要退出 each ...

  6. 如何安装或卸载Lodop、C-Lodop

    安装:下载.exe安装文件,一步步安装就行,如不特意拦截,应该是100%可以安装成功.客户端本地打印角色等,直接一步步安装就行,如果是广域网AO打印那种,在服务器上安装的c-lodop,需要勾选服务器 ...

  7. onbeforeunload事件两种写法及效果

    在符合W3C标准的浏览器里,可以使用addEventListener方法来添加事件. 当不需要为一个事件添加多个处理函数的时候,可以简单的使用onXXX=function(){}的方式来添加事件处理函 ...

  8. Y7000联想拯救者gtx1050Ti安装cuda9.0

    安装cuda经常会遇到安装失败的问题,原因大部分都是由于驱动不一致引起的,接下来我们分两步讲解 1. 安装驱动失败 原因:nvidia官网提供的驱动都是通用的,针对特殊设备可能出现不兼容问题,方法很简 ...

  9. hdu-6166(最短路+二进制分组)

    题意:给你n个点m条边的有向图,然后再给你k个不同的点,问你这k个点的最小距离: 解题思路:这道题最需要注意的就是k个点一定是不同的,那么有一个结论就是任意两个不同的数字中,在他们的二进制地表示中,一 ...

  10. BZOJ5296 [CQOI2018] 破解D-H协议 【数学】【BSGS】

    题目分析: 裸题. 代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; ; #define mp ...