定義了Manager作為全局變量,其中包含一個(gè)_ConnectionPtr和一個(gè)_RecordsetPtr成員變量.
執(zhí)行了3步操作
1 m_pLConnect.CreateInstance("ADODB.Connection");
m_pLRecordset.CreateInstance("ADODB.Recordset");
2 m_pLConnect->Open(....);
m_pLRecordset->Open(...);
3 m_pLConnect->Close();
m_pLRecordset->Close();
分別在3個(gè)函數(shù)中調(diào)用.
最后析構(gòu)Manager時(shí)(析構(gòu)函數(shù)里什么也沒有),出現(xiàn)錯(cuò)誤,指向
void _Release() throw()
{
if (m_pInterface != NULL) {
m_pInterface->Release(); //這里
}
}
m_pInterface 不為0.
我想ADO的connect和recordset不需要release吧,也不需要設(shè)為NULL吧?
哪這個(gè)錯(cuò)誤是怎么產(chǎn)生的呢?
問題點(diǎn)數(shù):100、回復(fù)次數(shù):23Top
對(duì)了,中間執(zhí)行的操作都很正常.Top
試試3的順序反一下:
m_pLRecordset->Close();
m_pLConnect->Close();
Top
Aizz(Nova),我試過了,還是不行.Top
這次我連open都沒有,只有createinstance,析構(gòu)時(shí)還出錯(cuò)Top
沒遇見過,錯(cuò)誤信息是什么?Top
抱歉,先離開,明天晚上再來
Top
_ConnectionPtr不需要每次用了都close,這個(gè)只需要在程序結(jié)束的時(shí)候close一下就行了,推薦這樣
//程序退出時(shí)關(guān)閉與數(shù)據(jù)源的連接
if(m_pConnection)
{
m_pConnection->Close();//關(guān)閉并釋放與數(shù)據(jù)庫的連接
}
同時(shí),建議將_ConnectionPtr m_pLConnect放在App類里面定義,在InitInstance函數(shù)中初始化,創(chuàng)建實(shí)體和打開,在ExitInstance中close。
Top
_ConnectionPtr我是只close了一次.
因?yàn)樾枰圆荒軐ConnectionPtr m_pLConnect放在App類里面定義,在InitInstance函數(shù)中初始化,創(chuàng)建實(shí)體和打開,在ExitInstance中close。
另外,提示錯(cuò)誤就是UNHANDLED EXCEPTION.就指向這里了.
void _Release() throw()
{
if (m_pInterface != NULL) {
m_pInterface->Release(); //這里
}
}
Top
那位高手能給我講解一下ado的connect和recordset的使用過程中,內(nèi)存是如何分配的?哪里申請(qǐng),哪里釋放,哪里設(shè)為NULL?Top
好像不要用哪個(gè)release函數(shù),我用哪個(gè)也出錯(cuò)的,
這樣行不行
m_pInterface->Close();
m_pInterface=NULL;Top
好像也不需要=NULL吧?Top
COM組件線程的公寓模型問題?
STA、MTA?
如果你進(jìn)行了跨線程的訪問,看看這方面的情況吧Top
拜托 zzyx(菜農(nóng))再說的詳細(xì)點(diǎn)好嗎?
這個(gè)問題,其實(shí)我自己已經(jīng)解決了.我發(fā)現(xiàn)
1 m_pLConnect.CreateInstance("ADODB.Connection");
m_pLRecordset.CreateInstance("ADODB.Recordset");
放置的位置不同,結(jié)果就會(huì)不同.可是我沒有跨線程訪問呀.
這兩個(gè)問題解答了都有分相送,還可以再加分.
那位高手能給我講解一下ado的connect和recordset的使用過程中,內(nèi)存是如何分配的?哪里申請(qǐng),哪里釋放,哪里設(shè)為NULL?
Top
>>放置的位置不同,結(jié)果就會(huì)不同.
樓主可以詳細(xì)說說是怎么個(gè)不同法嗎?
我在2000里試了一下,只要Close()的順序正確,是不會(huì)出錯(cuò)的。CreateInstance()的順序應(yīng)該不會(huì)有影響。
智能指針_RecordsetPtr和_ConnectionPtr在超出作用域是會(huì)自動(dòng)釋放的,也就是說指針在CreateInstance()的時(shí)候 分配內(nèi)存,在作用域外釋放,所以自己調(diào)用Release()并不是必需的,不過調(diào)用也不會(huì)出錯(cuò),而設(shè)為NULL是完全可以不用的。
Top
上面“CreateInstance()的時(shí)候分配內(nèi)存”這句應(yīng)該是“建立接口的引用”。Top
我還是有點(diǎn)懷疑你有跨線程的情況。
因?yàn)楹茱@然,用最普通的方式使用_ConnectionPtr來完成工作不會(huì)有任何問題,放到類里也不會(huì)有影響。
試驗(yàn)用參數(shù)COINIT_MULTITHREADED 或COINIT_APARTMENTTHREADED 調(diào)用
CoInitializeEx來初始化COM看看。
Top
哪我的指針不會(huì)超出作用域,除非推出程序.因?yàn)樗窃谝粋€(gè)全局變量里.
extern CMyParam MyParam; //MyParam里有connect和recordset智能指針
我在子對(duì)話框初始化時(shí),用CreateInstance(),并直接Open(),在子對(duì)話框OnCancel時(shí),用close().這樣一切都正常,即使再調(diào)用子對(duì)話框,也正常.
可我也不明白,這樣多次CreateInstance()沒有問題嗎?
如果把CreateInstance()放到主對(duì)話框的初始化中,在子對(duì)話框初始化時(shí)Open(),
在子對(duì)話框OnCancel時(shí),用close().不管在何處,用不用release(),賦不賦成NULL,最后推出程序,MyParam析構(gòu)時(shí)都會(huì)出錯(cuò).
就是我最先提出的那個(gè)錯(cuò)誤.
提示錯(cuò)誤就是UNHANDLED EXCEPTION.就指向這里了.
void _Release() throw()
{
if (m_pInterface != NULL) {
m_pInterface->Release(); //這里
}
}
Top
COM調(diào)用越界了(即在CoUninitialize()調(diào)用完成后,再調(diào)用COM的方法)因?yàn)槿肿兞康奈鰳?gòu)在最后才調(diào)用!檢查你的 CoInitialize(NULL)和CoUninitialize()調(diào)用,你在調(diào)用CoUninitialize()的位置設(shè)斷點(diǎn),在 ~CMyParam()內(nèi)部(任何語句處)也設(shè)斷點(diǎn).然后推出程序,看看程序先運(yùn)行到哪個(gè)斷點(diǎn)處就明白了~~~
解決方法:修改程序結(jié)構(gòu) ,不要在全局對(duì)象中使用智能指針~
Top
解決方法:修改程序結(jié)構(gòu) ,不要在全局對(duì)象中使用智能指針~,,或在CoUninitialize()調(diào)用之前,調(diào)用m_pLRecordset.Release(),m_pLConnect->
Release();
Top
我加了release也不行啊.
而且我用的是AfxOleInit().不用CoUninitialize()啊.Top
在CxxxAPP類的ExitInstance函數(shù)中調(diào)用release試試?Top
看來 lwg7603(刑滿釋放人員) 是正確。
可以這樣實(shí)現(xiàn):
增加Init,和Uninit函數(shù),其中分別完成創(chuàng)建對(duì)象,析構(gòu)對(duì)象的操作。
然后在代碼中需要的地方分別調(diào)用。這樣你就能把你的對(duì)象控制在COM作用范圍內(nèi)存在了。Top
聯(lián)系客服