第一部分:
其实Rp开始出现问题是在大约下午3点钟,和CR合作的程序测试版出现严重的乱码问题(以前修复过,又出现了),花了两个小时修复此BUG,然后保存工作,准备晚上给CR。
下午大约8点钟(应该是晚上了),程序发给CR,CR说用VS2008编译一下吧,结果发现这个问题。
char* pExt = strrchr(lpszPath, '.');
VS 说不能从const char* 转化为char*,CR在char* pExt前加了一个const 后编译通过(debug),结果运行后直接崩溃!
我用VC6编译通过,而且没有任何问题,后来发现VC6关于strrchr的声明和VS不一样,VC6返回值类型为char*,没有const。
但是这一个const 是不会导致程序崩溃的啊!我也用VS2008编译了一下工程,结果运行正常!
第二部分:
用VS2008 编译了lib,结果当然还是我这儿正常,CR那儿运行直接就挂掉了。后来发现CR不仅仅改动了EXE源码中的const,一个路径也由C改成了E,我也试着改成E,果然Crash!
由于debug版的lib不会出错,Release版又不好调试(无法通过调试器)下断。所以在lib中强行插入一个_asm int 3,生成工程时选区中Generate Debug Info,用VS的调试器挂上pdb搞了一阵,结果还是刚才乱码地方的BUG(虽然我没有看出有什么BUG,我估计我的思路是和DEBUG编译设置一致的),换了一种写法后,bug消失。
第三部分:
……
N次调试后,把程序再发给CR,CR惊奇地说能用了!我想这下可完了,由安培环路定理的RP守恒定律(详见《RP场论》:
http://tieba.baidu.com/f?kz=587028249),RP已经转移了!
把路径从E改成C,祈祷了半天囧RP别转移到我这儿。然后运行(Release版),然后console一闪直接消失!用cmd运行时发现了它的提示信息:
runtime error! R6002, floating point support not loaded. 晕,我得罪了谁啊,我的代码中连个float,%f,double都没有出现,连变量的名字中都没!看来RP真的转移了!
后来发现好像是exe的callback的问题(这个思路给了我强大的误导),因为我把callback直接返回FALSE,或者不调用stricmp等函数,就不会崩溃。如果说是这些函数的BUG,我真的不信。
第四部分:
把路径从C改成E后正常,改成C:\\Program Files依然正常,改成C:\\Documents and settings后崩溃,进一步发现改成C:\\Documents and settings\\Lightning后崩溃,但是改成C:\\Documents and settings\\Lightning\\桌面 后正常!
难道是所谓的临时文件和一些设置坏了我的事?为什么其它盘的文件就不会导致出错?无解。
第五部分:
从网上找了一些资料,说单单使用printf("%f", 10/3)这句是未定义的,可能导致C6002异常(可是我没用"%f"啊),抱着试一试的心理——————————
打开lib的源代码,在任意的地方(我选的是DllMain)添加下面一句:
float a = 0; 问题解决!!!
最后总结一句:
我一般是不会遇到RP问题的,我遇到的不是一般的RP问题T_T!