自己的话:
在Win7 x64 SP1 上调试同事的ADO相关代码,每次在调用 Command对象的CreateParameter时总是会遇到0xc0000005错误。各种调试之后不得其道,由于我本身对COM和ADO的实战经验就很少,因此一时无从下手,最后么有办法在Google上跑了一圈,看到一篇遇到和我类似问题的文章,也确实解决了这个问题,转载在这里。
原文链接:http://blog.csdn.net/guqiwei/archive/2010/12/16/6079537.aspx
正文:
一个小问题却搞了我一天时间,留个记号,以后注意。
昨天用ADO调用带参数的存储过程,其它一切都挺顺利的,到运行到:
m_lpCommand->CreateParameter(_T("@testn"),adInteger,adParamInput,l,_variant_t(1));
时却报 0xC0000005 错误。google一下问的人还挻多的,不过没有找到解决方法。
搞了一天,无果,今天早上来接着搞,将创建参数的方式改了一下:
_ParameterPtr lpParam;
lpParam.CreateInstance(__uuidof(Parameter));
lpParam->Name = _T("@testn");
lpParam->Type = adInteger;
lpParam->Direction = adParamInput;
lpParam->Value = _variant_t(0);
lpParam->Size = 1;
运行到最后一名时报:Run-Time Check Failure #0 错误,到此有些眉目了。
查看 ADO_LONGPTR 的类型为 ADO_LONGPTR 而 ADO_LONGPTR 定义为 __int64 看
出问题了吧。
原来我的是系统是win 7 64位的版本,而我的程序是x86的函数调用出错了。
这都是因为生成msado15.tlh时用的是
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
而在64位系统中这将生成64位版本的msado15.tlh
所以要想编译x86版本的程序应使用以下指令
#import "C:\Program Files (x86)\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")