COM规范中,所有的变量类型对于C语言来说只有一种:VARIANT。
如果我们想从数据库里面取出一个long类型的值,或者说COM控件需要返回给我一个值,都要通过VARIANT完成。
例如
CComQIPtr<Recordset> spRS;
VARIANT va;//这个用来取出受到影响的记录数量。
spRS->Execute("SELECT * FROM aTable", //执行这个sql语句
&va,//这个参数用来返回受到影响的记录数量
adCmdText);//这个参数用来说明是执行一个sql字串
....//剩下的省略了 懒
看上去好像没有什么问题,不过程序一般都会挂掉,如果加上try的话就可以知道是类型不匹配……
问题在什么地方?第二个参数按照要求给VARIANT的引用没有问题啊……就算懒一点,把va的类型变成_variant_t……很遗憾的说,程序还是很一般的挂了……
问题在于va的类型,度于一个VARIANT类型的东西来说,必须指出这个VARIANT的对象到底表示什么类型的,例如,这里返回一个long类型,就要在使用va之前指定va是一个VT_I4,最终呢,程序就变成这个样子:
CComQIPtr<Recordset> spRS;
VARIANT va;//这个用来取出受到影响的记录数量。
va.vt=VT_I4; //这个样子就好鸟
spRS->Execute("SELECT * FROM aTable", //执行这个sql语句
&va,//这个参数用来返回受到影响的记录数量
adCmdText);//这个参数用来说明是执行一个sql字串
....//剩下的省略了 懒
以上内容针对VC6 (没有sp)。
在vs.net 2005中 _variant_t 的功能得到了加强。不过不知道是否能直接使用。