tokiといいます。
VS6.0 C++でAccessをopen時にエラーが出て困っています。
どなたかご存知の方がいらっしゃいましたらご教授ください。
宜しくお願いいたします。
□環境
OS:win xp pro sp3
VS6.0
Aceess 2003
□事象
1. AAA.mdb open 正常終了
2. AAA.mdb close 正常終了
3. AAA.mdb open 異常終了 以下、メッセージです。
ハンドルされていない例外は、*****.exe(DAO360.DLL)にあります:
OXC0000005 Access Violation
□対処
1.dao360.dllをレジストリに再登録
2.officeの修復
□対処結果
状況変わらず。
以上です。
AfxGetModuleState()->m_dwVersion = 0x0601;
void CHogeHoge::OnOK()
{
CDaoDatabase db;
db.Open(d:\\db54.mdb,FALSE ,FALSE ,");
CDaoRecordset rso(&db);
rso.Open(dbOpenDynaset,SELECT * FROM list);
rso.Close();
db.Close();
db.Open(d:\\db54.mdb,FALSE ,FALSE ,");
db.Close();
}
OS:win 2000 SP4
VS6.0 SP6
Aceess 2003
db54.mdbはAceess 2003にて作成したファイル
こんな感じのコードだと再現しませんでした。
再現可能な最小のソースは提示できませんか?
#VS6のSPはいくつですか?
おはようございます。tokiです。
とおりさん、回答ありがとうございます。
ソースを以下に記述します。
また、VS6.0のバージョン情報を見ましたがVS6.0 C++でした。
□ソース
int Sv_main(char* ID,char* PASSWD)
{
CDaoDatabase DUSER_Dao;
int lc_Ret;
if(MDBMopen_Exc(&DUSER_Dao, DBname, DB_NOEXCL) != DB_NORMAL)
return -1;
.
.
}
DEFDLL int MDBMopen_Exc(CDaoDatabase* databasep, int db_kind, int excl_flg)
{
CString database_name;
AfxGetModuleState()->m_dwVersion = 0x0601;
.//db_kind情報からdatabase_nameへパスとmdb名が変換されます。
.
try{
databasep->Open(database_name, FALSE, FALSE); <==ココデdao360.dllエラー発生
}
catch(CDaoException* e){
e->Delete();
return(DB_OPENERR);
}
return(DB_NORMAL);
}
以上です。宜しくお願い致します。
#VS6のSPはいくつですか?
聞かれているのは、サービスパックのバージョンですよ。
SPに関してはVC++6.0の場合、バージョン情報とかには出てこないので
何処まで適応しているかはインストールした時に記録にでも残しておかないと
わからないと思います。
もし、全く当てていない状態なら当てておいた方が良いと思いますけれど。
皆さん、ありがとうございます。tokiです。
VS6のサービスパックはSP6でした。
宜しくお願いいたします。
close部分のソースはどんなんでしょう?
rinさん、ありがとうございます。tokiです。
close部分のソースは以下のようになります。
□ソース
DEFDLL int MDBMAclose_Exc(CDaoDatabase *databasep, int db_kind)
{
try{
databasep->Close();
}
catch(...){
return DB_EXCEPTION;
}
return DB_NORMAL; //正常終了
}
以上、宜しくお願い致します。
再現しませんでした。
問題の切り分けのために、新規でダイアログのプロジェクトを作成して
私の提示したソースを実行してみるとどうなりますか?
#mdbファイルなども直指定で
またオープンの所にブレークを張ってF11でステップインしていって
DAOCORE.CPPのどこでエラーが発生しているか確認できませんか?
↑環境によってはソースは見られないかも。
とうりさん、ありがとうございます。tokiです。
まず、DAOCORE.CPP内でのエラー発生箇所情報を報告します。
□ソース
void CDaoDatabase::Open(LPCTSTR lpszName, BOOL bExclusive,
BOOL bReadOnly, LPCTSTR lpszConnect)
{
ASSERT_VALID(this);
// Re-Opening is invalid.
if (IsOpen())
{
ASSERT(FALSE);
return;
}
// Allocate, maintain and/or open workspace if necessary
InitWorkspace();
COleVariant var(lpszName, VT_BSTRT);
DAO_CHECK(m_pWorkspace->m_pDAOWorkspace->OpenDatabase(
V_BSTR(&var),
COleVariant((long)bExclusive, VT_BOOL),
COleVariant((long)bReadOnly, VT_BOOL),
COleVariant(lpszConnect, VT_BSTRT),
&m_pDAODatabase)); <==ココデエラー発生
以上、宜しくお願いいたします。
皆さん、お世話になります。tokiです。
先ほどのDAOCORE.CPPの各引数の値を追加報告します。
□ソース
void CDaoDatabase::Open(LPCTSTR lpszName, BOOL bExclusive,
BOOL bReadOnly, LPCTSTR lpszConnect)
・lpszName = 正しいパス名&mdb名
・bExclusive = 0
・bReadOnly = 0
・lpszConnect = "(空です)
DAO_CHECK(m_pWorkspace->m_pDAOWorkspace->OpenDatabase(
V_BSTR(&var),
COleVariant((long)bExclusive, VT_BOOL),
COleVariant((long)bReadOnly, VT_BOOL),
COleVariant(lpszConnect, VT_BSTRT),
&m_pDAODatabase));
・VT_BOOL = 11
・VT_BSTRT = シンボル名がみつかりません
・&m_pDAODatabase = 0x00000000
以上、宜しくお願いいたします。
> 問題の切り分けのために、新規でダイアログのプロジェクトを作成して
> 私の提示したソースを実行してみるとどうなりますか?
> #mdbファイルなども直指定で
これ重要だよ。
今まで「多分こっちの方向は症状とは無関係だろうなぁ」と思いつつ周囲300°ほどを見渡
して原因を探っていた回答者の人達が、この結果いかんで前方100°程(適当値)に絞って
原因探索を行えるようになるかもしれない。
gakさん、ありがとうございます。tokiです。
今、割り込み作業発生の為、未だ実行できてません。
実行できしだい、報告いたします。
gakさん、とおりさん tokiです。
ご提示して頂いたソースベースで正常動作いたしました。
違いが何なのか、未だわかりませんが、冷静に自分のソースを
見直してみます。
この結果から、何かヒントがありましたらお教えください。
宜しくお願い致します。
皆さん、お世話になります。tokiです。
ソースを見直してましたら、これかっと思われる点がありました。
以下のように、サブスレッドからopenすると異常終了。
メインスレッドだと正常終了しました。
□事象
1. AAA.mdb open [メインスレッド]正常終了
2. AAA.mdb close [メインスレッド]正常終了
3. AAA.mdb open [サブスレッド] 異常終了
□対処
1. AAA.mdb open [メインスレッド]正常終了
2. AAA.mdb close [メインスレッド]正常終了
3. AAA.mdb open [メインスレッド]正常終了
初歩的なことなのかも知れませんが、サブスレッドからは、できないのでしょうか?