xmhhh 发表于 2008-2-29 17:01:00

VS2002+ObjectARX2004 ARX调用ADO ACAD2004直接crash

<p>环境组合 WinXP SP2 VS2002+ObjectArx2004+acad2004或acad2006</p><p>在stdafx.h中</p><p>#pragma warning(disable:4146)&nbsp; <br/>#import "C:\Program Files\Common Files\System\ado\msado15.dll" rename_namespace("ARXADO") rename("EOF","adoEOF"),rename("BOF","adoBOF"),rename("EOS","AdoEOS")</p><p>using&nbsp;&nbsp; namespace ARXADO;<br/>#pragma warning(default:4146)<br/></p><p>下面为函数调用,在Open时就Crash,找遍网上都没有答案,</p><p>if(FAILED(::CoInitialize(NULL))) <br/>&nbsp;{<br/>&nbsp;&nbsp;AfxMessageBox("CoInitialize失败!");<br/>&nbsp;&nbsp;return;<br/>&nbsp;}<br/>&nbsp;&nbsp;_ConnectionPtr m_pConnection;<br/>&nbsp;&nbsp;_RecordsetPtr&nbsp;&nbsp; m_pRecordset;&nbsp;&nbsp;<br/>&nbsp;<br/>&nbsp;m_pConnection.CreateInstance(__uuidof(Connection));<br/>&nbsp;m_pRecordset.CreateInstance(__uuidof(Recordset));&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;<br/>&nbsp;CString m_strConnection;<br/>&nbsp;try<br/>&nbsp;{<br/>&nbsp;&nbsp;m_strConnection.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s",strMDBFileName);<br/>&nbsp;&nbsp;m_pConnection-&gt;Open((_bstr_t)m_strConnection,"","",adModeUnknown);//CAD 崩溃crash<br/>&nbsp;}<br/>&nbsp;catch(_com_error &amp;e)<br/>&nbsp;{<br/>&nbsp;&nbsp;strError.Format("数据库连接失败!原因:%s",e.ErrorMessage());<br/>&nbsp;&nbsp;&nbsp;&nbsp;return;<br/>&nbsp;}</p>

bluelightcsy 发表于 2008-3-1 11:25:00

<p>粗看一下你代码。。。从我观点来说,如果你是专业程序员,你需要再写得完善一些。你CreateInstance后没有判断是否成功,就直接用指针,相当危险。而且从你的Try,Catch来看,Crash肯定有异常,而不是COM异常,考虑可能是前面创建对象没成功,看一下返回值吧。用指针前判断一下。调一下看看。</p>

xmhhh 发表于 2008-3-8 23:02:00

<p>谢谢您的回答,</p><p>我重新判断了CreateInstance是否失败,没有出错,还是在Open时Crash,</p><p>在VC6+ObjectArx2002+Acad2002调用Ado都可以</p><p>在VS2003+ObjectArx2006+Acad2006调用Ado也可以</p><p>唯独VS2002+ObjectArx2004+Acad2004就Crash,</p><p>由于VS2003会弹出讨厌的提示框,一直想用VS2002最好</p><p>也找到微软升级VS2002的SP1,好不容易才装好(重装系统),</p><p>还是不行,对了,我不是专业的程序员,做设计的,对编程感兴趣,希望得到大家的帮助。</p><p>对了,你们如用VS2002 版本是多少?</p>
页: [1]
查看完整版本: VS2002+ObjectARX2004 ARX调用ADO ACAD2004直接crash