最近发现在Win7下使用VS开发C++项目时,在编译生成目标文件的时候总会时不时的出个link错误:fatal error LNK1000: Internal error during IncrBuildImage,还以为是程序写的有问题,后来发现再执行一次build就不会出错了!其实原来在xp下用VS2008也没出过这个问题,直到最近发现出现频率越来越高,受不了了开始寻求解决方法,发现其实是bug,而且ms也已经提供了补丁:http://support.microsoft.com/kb/948127,打上补丁就解决了。
Android平台中BitmapFactory.decodeResource对GL程序材质的影响
在Android平台下实现OpenGL ES程序的贴图加载操作一般是通过BitmapFactory.decodeResource这个api,然后用系统封装好的GLUtils.texImage2D函数直接转换为gl贴图即可,方便快捷。但在较新版的Android系统中res中的图片文件夹根据dpi设备分辨率的不同,细分了很多文件夹处理以支持不同设备的分辨率加载对应的图片,如drawable-hdpi,drawable-ldpi,drawable-mdpi等,如果没有注意这个问题而将贴图图片随意安置的话,在decode的时候系统会默认根据设备dpi的不同对目标图片格式解码的同时进行大小调整,也就是说有可能破坏原本已经是2^n大小的贴图图片,导致原本在模拟器上正确的绘图在真机上变成大白板!
解决这个问题的方法可以将图片放到不受dpi影响的drawable-nodpi中,或者设置BitmapFactory的选项,不处理dpi相关问题。
Max SDK Wizard For VC9(VS2008)
http://www.k-res.net/dl/maxtemp.rar
基于原作者Eric Feng的2005版本稍作修改,感谢原作者!
安装方法:解压压缩包内内容到任意位置,不要执行里面的js,那些是原作者2k5版本的自动安装脚本。复制其中3dsmaxPluginWizard.ico,3dsmaxPluginWizard.vsdir,3dsmaxPluginWizard.vsz到vc9的项目模板文件夹(如:D:\Program Files\Microsoft Visual Studio 9.0\VC\vcprojects),用记事本修改vsz文件,将Param=”ABSOLUTE_PATH = D:\Program Files\3dsmaxPluginWizard\Files”中的路径换成刚解压的对应文件夹绝对路径就ok了
关于Nokia 5800安装sis时的证书过期问题
以前在S60 3rd的机器上安装刚做好的sis时也会出现“证书过期”的提示,或者是证书尚未生效,但通过调整系统日期时间的方式可以将就过去,可5800上出现同样问题时就不行了,调系统时间怎么也找不到证书合法的时间段,调靠后点说证书过期,靠前点说证书非法,已过期或手机日期设置不正确(Certificate may be not valid, is expired or phone’s date settings may be incorrect)等,确定证书生效时间肯定没问题(经过symbiansigned在线签证的,装在3版机上也没问题)。其实这是5800系统的一个bug,据说目前还没有修正,经过我的测试,这个bug只会影响非自签名的sis安装,如果是自签名的包安装是不会出这种错的。在这bug修正前的临时解决方法就是备份手机资料,然后用*#7370#将手机恢复出厂设置(默认锁码12345),然后重启设置正确的时区日期时间以后就可以了。N97没试过是否也这样,所以不确定这个问题是5800的通病还是S60 5th的通病。
Symbian编译时的Error -1073741819错误
完整错误信息类似下面这样:
make[1]: *** [\Symbian\9.2\S60_3rd_FP1_2\EPOC32\BUILD\…\Gif_Reader.o] Error -1073741819
make[1]: *** Waiting for unfinished jobs….
make[1]: *** Waiting for unfinished jobs….
make[1]: *** Waiting for unfinished jobs….
make: *** [TARGETMGATE] Error 2
这只是在整个过程中的一部分出现,最后提示还是***Build Complete,carbide的problems里也没有任何对应的代码位置提示,很容易误解成sdk或这编译器坏了,网上有人说重装sdk,有人说clean一遍项目。其实这是由于代码里写了一些貌似合法但实际不对的写法,举个具体的例子就是拿对象类型的变量强制转换成指针使用,比如
CCoeControl& iParent;
((CTestAppView*)iParent)->foo();
这样,就会导致这种build错误。
WM下MFC基于对话框(dialog based)程序的最小化
在WM下的MFC基于对话框程序(VS模板自动生成状态下),运行之后右上角显示的是OK图标,点击后走的逻辑是dialog的OnOK()默认逻辑,会直接把对话框程序关闭掉。这个右上角的按钮据说在SDI或MDI程序运行时显示的是X,会有对应smart minimize的功能,就是点了是最小化隐藏的功能。开始尝试使用ShowWindow(SW_MINIMIZE)的方法来最小化对话框程序,发现结果是右上角的ok没了,下面的左右软键菜单没了,但程序主窗口还在显示,没有像用过的其他程序那样ok按了以后显示windows的today界面。后来换用ShowWindow(SW_HIDE),这样确实是隐藏了,也看见today了,但是再想重新打开程序就不行了,htc的应用程序列表里没有我的程序,开进程管理器直接激活进程倒是可以,但是切换的话会提示说程序窗口已被隐藏XX,不能再打开了,只能强制结束进程。
其实这个问题好像很早以前就被发现了,据说是个today的bug,详情看这:QA: How to create Today-friendly dialog based application?,默认对话框的窗口类型是WS_POPUP,而默认情况下基于对话框程序的这个dialog window的parent就是today这个窗口(等价于windows的desktop),最小化或者直接激活today显示会导致触发其子窗口的显示,所以又把dialog给弄出来了,解决方法倒是相当简单:把WS_POPUP样式换成WS_OVERLAPPED!
关于WM上左右软件菜单项的EnableMenuItem(使用MFC的CCommandBar添加)
关于WM上MFC程序对左右软件菜单的控制,可以用win32的方法ShCreateMenu这套逻辑,或者使用CCommandBar这个类(替换掉的以前5.0之前的CCeCommandBar类),先Create然后InsertMenuBar就可以将常规menu资源作为左右软键对应的菜单显示,还可以添加toolbar,虽然看上去有点挤。
由于这种创建菜单的方法,让我误认为只是将win32的menu换了个添加方法,换了个绘图位置,导致后来要实现动态enable,disable菜单项时遇到了挠头的问题。按照常规的做法,在执行逻辑时调用EnableMenuItem(hMenu,IDM_MITEM,MF_BYCOMMAND|MF_GRAYED),函数调用,返回值以及参数hMenu都没有问题,但执行起来就是没有disabled的效果,google了一通发现国内国外都有很多人提到这个问题,最终也没有个明确的答复,不是说参数hMenu不对,就是说用ShGetMenuXXX的去取菜单,怎么看也不像是真正的解决办法。
后来在一篇动态更新菜单名称的文章中看到貌似WM对左右软键的菜单是作为POPUP MENU处理的,也就不像是win32正统主菜单那样,嗖得丝内,恍然大悟,换用响应WM_INITMENUPOPUP消息的方式,对要变更的菜单项作弹出菜单时的enable disable处理,问题解决,没想到被一个菜单项给杯具了……
用MS Office 2003打开2007保存的文件!
偶然发现M$的官网上居然有能让office 2k3打开2k7文件的转换器,这样在实在不想用非主流界面的2k7的时候还能有个将就的解决办法,试了几个简单的word,excel文件,没法先有什么异样之处。
记录下载地址:http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=941B3470-3AE9-4AEE-8F43-C6BB74CD1466,以备不时之需。