ExtractAssociatedIcon 的一点问题
今天 卡牌对决 升级,没在 vista 下测试。晚上就有人报告 vista 下运行不了了。
netbug 同学在家里取了一份代码查看。据说错误是出在 ExtractAssociatedIcon 这个 api 的调用内部。是下面这样一行 api 调用:
hIncon = ExtractAssociatedIcon( inst, "loader.exe", &wIndex );
但是 msdn 上看不出所以然来。
之前,vista 下都是运行正常的。netbug 同学说,唯一的区别,以前是 vc6 编译的,而现在换成了 vc9 。
一般情况下,换编译器不会造成 api 调用失败呀?这是为什么呢?
我上 google 搜到了 msdn 里关于 ExtractAssociatedIcon 的文档 ,( google ExtractAssociatedIcon site:msdnmicrosoft.com)。
HICON ExtractAssociatedIcon(
HINSTANCE hInst,
LPTSTR lpIconPath,
LPWORD lpiIcon
);
我注意到,这第二个参数类型是 LPTSTR 而不是 LPCTSTR 。
建议 netbug 同学改成:
char filename[]="loader.exe";
hIncon = ExtractAssociatedIcon( inst, filename, &wIndex );
居然就对了。-_-
之所以换了编译器就出问题,可能是因为不同的 linker 的策略不一样。或许 vc9 把 "loader.exe" 放到了一个只读段里去了,因为 vista 的 api 实现不太一样,导致去写一个只读页。(也有可能是 vista 的 PE Loader 的区别,不想深究了)
之所以这次我能在半分钟内反应过来,是因为以前碰到过类似的 Windows 版本之间平台差异问题。
GetGlyphOutline 就有这个问题。如果说 ExtractAssociatedIcon 的 msdn 文档还隐晦了指出了问题,GetGlyphOutline 就能肯定是 bug 了。
GetGlyphOutline 的最后一个参数类型是 const MAT2 *lpmat2 ,写明了是 const 。但是如果你定义一个 static const MAT2 ,然后把指针传进去的话,某个平台的 windows 下,进程会崩溃在这个 api 调用里。(可能是 Windows 98 ,因为这是很多年前开发大话 client 时遇到的了)
btw, netbug 同学在家里想 checkout 办公室内部的 svn ,而我们并没有提供外部 vpn 登陆的途径。而我还在办公室。有什么简单的办法呢?我发现 ssh 的 tunnel 功能可以安全的解决这个问题。
我们找了台外部大家都可以 ssh 登陆的机器,然后我先 ssh 上去,做一个 remote tunnel ,把我可以看见的办公室内部的 svn tunnel 到那台机器的本地。然后 netbug 同学再 ssh 过去,做一个 local tunnel 把管道对接回他家里的 PC 就 OK 了。 :D
这个方法值得推广。
2009 年 2 月 14 日补充:
今天 netbug 同学重新读了 msdn 文档,发现文档中提到了,第二个参数是有可能被改写的。不过文档中没有正确标明类型是 [in,out] ,而是标注成 [in] 。
不过奇怪的是,既然这个指针有可能接收返回串,但却并没有指定最大长度,是否会有栈溢出的安全隐患?
谨慎起见,需要把 filename 定义成:
char filename[MAXPATH]="xxxx";
(严格说,应该是用 TCHAR)
Comments
Posted by: noname | (23) January 31, 2012 05:01 PM
Posted by: 木易哥 | (22) December 15, 2011 10:04 AM
Posted by: mofun.cc | (21) March 19, 2009 09:43 PM
Posted by: rulary | (20) March 8, 2009 05:23 PM
Posted by: Cloud | (19) February 27, 2009 06:39 PM
Posted by: frey | (18) February 27, 2009 05:01 PM
Posted by: 辰玉 | (17) February 20, 2009 06:04 PM
Posted by: 皇冠 | (16) February 20, 2009 01:45 PM
Posted by: vczh | (15) February 19, 2009 01:39 PM
Posted by: smc | (14) February 18, 2009 01:48 PM
Posted by: tristar | (13) February 16, 2009 03:01 PM
Posted by: wanfuwu | (12) February 16, 2009 12:30 AM
Posted by: lg | (11) February 14, 2009 09:36 PM
Posted by: Atry | (10) February 14, 2009 08:28 PM
Posted by: Atry | (9) February 14, 2009 08:25 PM
Posted by: zyzx | (8) February 14, 2009 03:23 PM
Posted by: zyzx | (7) February 14, 2009 03:15 PM
Posted by: 巫山霏云 | (6) February 14, 2009 09:28 AM
Posted by: Cloud | (5) February 14, 2009 05:02 AM
Posted by: dpff | (4) February 14, 2009 03:00 AM
Posted by: Cloud | (3) February 14, 2009 01:55 AM
Posted by: noname | (2) February 14, 2009 01:34 AM
Posted by: lbaby | (1) February 14, 2009 01:15 AM