关于 CreateInstance(_uuidof(Connection)) 创建失败的有关问题
关于 CreateInstance(_uuidof(Connection)) 创建失败的问题
是在MFC下写的程序
1,已经加引入
#import "msado15.dll" no_namespace rename ("EOF","adoEOF")
2,在CNGWebUIServerApp::InitInstance()加
AfxOleInit();
我是将连接数据库的操作写成一个类的方法,如果是在CNGWebUIServerDlg类调用该方法就没有问题。
如果在其他类调用的话,就会
CreateInstance(_uuidof(Connection)) 创建失败,老是找不出为什么,知道的大虾帮下忙啊。谢了
------解决方案--------------------
资源还没有释放掉。
一开始时就调用了CreateInstance(_uuidof(Connection)) ,你没有释放掉,再创建时它还存在,所以出错。
AfxOleInit(); 最好要在你写的那个类时就要初始化COM的了。
用完的话就立刻释放,以便第而次调用。
CoUninitialize();
最好就用智能指针写一个类
这是我初始化和释放的函数
_ConnectionPtr m_pConnection;//指向Connection对象的指针
_RecordsetPtr m_pRecordset;//....Recordset........
void CAccessConn::OnInitAccessConn()
{
CoInitialize(NULL);
try
{
m_pConnection.CreateInstance("ADODB.Connection");
m_pConnection->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db11.mdb";
m_pConnection->Open("","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
void CAccessConn::CutConn()
{
if(m_pRecordset!=NULL)
m_pRecordset->Close();
m_pConnection->Close();
CoUninitialize();
}
------解决方案--------------------
>>这种方法写了一下,发现那个问题还是存在。
>>程序进入m_pConnection.CreateInstance("ADODB.Connection")后,单步调试
>>Interface* m_pInterface;
// Releases only if the interface is not null.
// The interface is not set to NULL.
//
void _Release() throw()
{
if (m_pInterface != NULL) { //就在这出错了
m_pInterface->Release();
}
}
>>错误提示是Unhandled exception in : 0xC0000005 :Access Violation;
程序关闭时要关闭连接:
比如你可以在
int CUmsApp::ExitInstance()
{
// TODO: Add your specialized code here and/or call the base class
//
if ( pConn->State )
{
pConn->Close();
pConn = NULL;
}
return CWinApp::ExitInstance();
}
------解决方案--------------------
首先你自己看下错误码。另外,你看看两个地方调用的是否同一个线程。
主要看下出错的地方是否没有初始化com
------解决方案--------------------
应该是你原来的连接没有关掉吧
------解决方案--------------------
创建ADO对象要调用
CoInitialize
而不是AfxOleInit
------解决方案--------------------
用在多线程里?
------解决方案--------------------
每个线程都要初始化com环境
是在MFC下写的程序
1,已经加引入
#import "msado15.dll" no_namespace rename ("EOF","adoEOF")
2,在CNGWebUIServerApp::InitInstance()加
AfxOleInit();
我是将连接数据库的操作写成一个类的方法,如果是在CNGWebUIServerDlg类调用该方法就没有问题。
如果在其他类调用的话,就会
CreateInstance(_uuidof(Connection)) 创建失败,老是找不出为什么,知道的大虾帮下忙啊。谢了
------解决方案--------------------
资源还没有释放掉。
一开始时就调用了CreateInstance(_uuidof(Connection)) ,你没有释放掉,再创建时它还存在,所以出错。
AfxOleInit(); 最好要在你写的那个类时就要初始化COM的了。
用完的话就立刻释放,以便第而次调用。
CoUninitialize();
最好就用智能指针写一个类
这是我初始化和释放的函数
_ConnectionPtr m_pConnection;//指向Connection对象的指针
_RecordsetPtr m_pRecordset;//....Recordset........
void CAccessConn::OnInitAccessConn()
{
CoInitialize(NULL);
try
{
m_pConnection.CreateInstance("ADODB.Connection");
m_pConnection->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db11.mdb";
m_pConnection->Open("","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
void CAccessConn::CutConn()
{
if(m_pRecordset!=NULL)
m_pRecordset->Close();
m_pConnection->Close();
CoUninitialize();
}
------解决方案--------------------
>>这种方法写了一下,发现那个问题还是存在。
>>程序进入m_pConnection.CreateInstance("ADODB.Connection")后,单步调试
>>Interface* m_pInterface;
// Releases only if the interface is not null.
// The interface is not set to NULL.
//
void _Release() throw()
{
if (m_pInterface != NULL) { //就在这出错了
m_pInterface->Release();
}
}
>>错误提示是Unhandled exception in : 0xC0000005 :Access Violation;
程序关闭时要关闭连接:
比如你可以在
int CUmsApp::ExitInstance()
{
// TODO: Add your specialized code here and/or call the base class
//
if ( pConn->State )
{
pConn->Close();
pConn = NULL;
}
return CWinApp::ExitInstance();
}
------解决方案--------------------
首先你自己看下错误码。另外,你看看两个地方调用的是否同一个线程。
主要看下出错的地方是否没有初始化com
------解决方案--------------------
应该是你原来的连接没有关掉吧
------解决方案--------------------
创建ADO对象要调用
CoInitialize
而不是AfxOleInit
------解决方案--------------------
用在多线程里?
------解决方案--------------------
每个线程都要初始化com环境