VS6.0 "DAO360.DLL" Access Violation

[戻る]
toki 2008/09/17(水) 17:38:27
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の修復

□対処結果
状況変わらず。

以上です。   

とおり 2008/09/17(水) 18:50:57
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 2008/09/18(木) 09:41:42
おはようございます。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);
}
以上です。宜しくお願い致します。

... 2008/09/18(木) 10:05:16
#VS6のSPはいくつですか?
聞かれているのは、サービスパックのバージョンですよ。

PATIO 2008/09/18(木) 10:15:50
SPに関してはVC++6.0の場合、バージョン情報とかには出てこないので
何処まで適応しているかはインストールした時に記録にでも残しておかないと
わからないと思います。
もし、全く当てていない状態なら当てておいた方が良いと思いますけれど。

toki 2008/09/18(木) 10:30:44
皆さん、ありがとうございます。tokiです。

VS6のサービスパックはSP6でした。

宜しくお願いいたします。

rin 2008/09/18(木) 12:31:08
close部分のソースはどんなんでしょう?

toki 2008/09/18(木) 13:35:00
rinさん、ありがとうございます。tokiです。
close部分のソースは以下のようになります。

□ソース
DEFDLL int MDBMAclose_Exc(CDaoDatabase *databasep, int db_kind)
{
 try{
   databasep->Close();
 }
 catch(...){
   return DB_EXCEPTION;
 }
 return DB_NORMAL;        //正常終了
}
以上、宜しくお願い致します。

とおり 2008/09/18(木) 14:30:02
再現しませんでした。

問題の切り分けのために、新規でダイアログのプロジェクトを作成して
私の提示したソースを実行してみるとどうなりますか?
#mdbファイルなども直指定で


またオープンの所にブレークを張ってF11でステップインしていって
DAOCORE.CPPのどこでエラーが発生しているか確認できませんか?
↑環境によってはソースは見られないかも。 

toki 2008/09/18(木) 14:56:41
"とうり"さん、ありがとうございます。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 2008/09/18(木) 15:19:13
皆さん、お世話になります。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

以上、宜しくお願いいたします。

gak 2008/09/18(木) 16:57:16
> 問題の切り分けのために、新規でダイアログのプロジェクトを作成して
> 私の提示したソースを実行してみるとどうなりますか?
> #mdbファイルなども直指定で
これ重要だよ。
今まで「多分こっちの方向は症状とは無関係だろうなぁ」と思いつつ周囲300°ほどを見渡
して原因を探っていた回答者の人達が、この結果いかんで前方100°程(適当値)に絞って
原因探索を行えるようになるかもしれない。

toki 2008/09/18(木) 17:08:34
gakさん、ありがとうございます。tokiです。

今、割り込み作業発生の為、未だ実行できてません。

実行できしだい、報告いたします。

toki 2008/09/18(木) 17:30:08
gakさん、"とおり"さん tokiです。

ご提示して頂いたソースベースで正常動作いたしました。

違いが何なのか、未だわかりませんが、冷静に自分のソースを

見直してみます。

この結果から、何かヒントがありましたらお教えください。

宜しくお願い致します。

toki 2008/09/18(木) 18:17:55
皆さん、お世話になります。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  [メインスレッド]正常終了

初歩的なことなのかも知れませんが、サブスレッドからは、できないのでしょうか?

とおり 2008/09/18(木) 19:51:20
スレッドでOpen・Close後2回目のOpenで落とせました。

DBのCloseの後で
AfxDaoTerm();
を呼んであげればいいみたいです。(正しい操作なのかは不明)


以下も読んでみてください。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200308/03080037.txt
http://m--takahashi.com/bbs/pastlog/A8500/A8466.html

http://msdn.microsoft.com/ja-jp/library/cc438656(VS.71).aspx


Google
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-
8&rlz=1T4GGLJ_jaJP204JP205&q=AfxDaoTerm+%e3%82%b9%e3%83%ac%e3%83%83%e3%83%89

とおり 2008/09/18(木) 20:16:58
リンク間違えました。

http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-
8&rlz=1T4GGLJ_jaJP204JP205&q=DAO+%e3%82%b9%e3%83%ac%e3%83%83%e3%83%89

toki 2008/09/19(金) 13:44:20
[[解決]]
 "とおり"さん、ありがとうございます。tokiです。

お教え下さったリンクも参考にさせて頂きました。

結果、私の組み方がそもそも良くないと気がつきました。

やはり、メインスレッドでmdbをアクセスすべきであり、組み替えします。

 "とおり"さんを始め、考えて下さった皆さん有難う御座いました。 感謝!

古いスレッドには追加発言できません。