从VC6或者VC2003(VC7.1)升级到VC2008(VC9.0)之后,很多的程序不能编译了,很多能编译的运行的不对了。
比如:
过去的ADO数据库访问一切正常,到了2008里虽然可以编译,但是取出的整数值都是0,跟踪发现,代码中的一段:
_variant_t aa = GetValueByField(strFName);
if( aa.vt == VT_NULL )
return 0;
return aa.intVal;
aa的值正确,但是aa.intVal的值是0,咨询同事后得知这里应该写为
return int(aa);
修改后在2008也正常了。可能变体类型的定义在2008里发生了变化,所以过去那种比较猛的直接访问数据成员的方法失效了。
还比如一个COM组件的调用程序,过去一直正常,2008里不能编译了,出错在
[ module(DLL, name="Fst", uuid="{2726C85B-BF30-4b4b-8529-289D3E05CE4B}") ];
修改为
[ module(type=dll, name="DllFst", uuid="{2726C85B-BF30-4b4b-8529-289D3E05CE4B}") ];
即可编译通过,这里是因为2008里的写法要求更严格了。
还有类似的错误:
__hook(&IFstEvents::OnRegChange, pSource, OnRegChange);
需要修改为:
__hook(&IFstEvents::OnRegChange, pSource, &CMsg::OnRegChange);
类成员函数需要加上类名和取地址符(是编译器告诉我要这样写的)。
还好,多数程序最终还是通过了编译,希望他们也能正确的运行。
比如:
过去的ADO数据库访问一切正常,到了2008里虽然可以编译,但是取出的整数值都是0,跟踪发现,代码中的一段:
_variant_t aa = GetValueByField(strFName);
if( aa.vt == VT_NULL )
return 0;
return aa.intVal;
aa的值正确,但是aa.intVal的值是0,咨询同事后得知这里应该写为
return int(aa);
修改后在2008也正常了。可能变体类型的定义在2008里发生了变化,所以过去那种比较猛的直接访问数据成员的方法失效了。
还比如一个COM组件的调用程序,过去一直正常,2008里不能编译了,出错在
[ module(DLL, name="Fst", uuid="{2726C85B-BF30-4b4b-8529-289D3E05CE4B}") ];
修改为
[ module(type=dll, name="DllFst", uuid="{2726C85B-BF30-4b4b-8529-289D3E05CE4B}") ];
即可编译通过,这里是因为2008里的写法要求更严格了。
还有类似的错误:
__hook(&IFstEvents::OnRegChange, pSource, OnRegChange);
需要修改为:
__hook(&IFstEvents::OnRegChange, pSource, &CMsg::OnRegChange);
类成员函数需要加上类名和取地址符(是编译器告诉我要这样写的)。
还好,多数程序最终还是通过了编译,希望他们也能正确的运行。