トップ回答者
VB6でAccess2010データベースにUPDATEしたらmsjet40.dll、ntdll.dllエラーでクラッシュする

質問
-
VB6で下記プログラムを作成しVB6エディタで実行すると、Access2010データベースの更新(UPDATE)がきますが、コンパイルを
行い、exeファイルで実行すると、msjet40.dll、ntdll.dllエラーが発生しクラッシュしてしまいます。2015/7/17にできないこ
とが発覚しました。それ以前は、問題なく起動していました。Winows Updateが原因でしょうか。
クラッシュを引き起こすパソコンは、Windows7、Windows 2012Serverで確認できています。
尚、本プログラムをデバックした所、下記ステップにてクラッシュしている模様です。
cnn.Execute (SQLbum)
Execute発行で、クラッシュする。
対処方法をご存じの方は、ご教示ください。
プログラム-----------------------------------------------------------------------------------------------
dbName = "R-UPS故障DB.mdb" 'MDBファイル名
dbPath = App.Path & "\"
' MDB との接続を確立する。決まり文句です。
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & dbPath & dbName & ";"cnn.CursorLocation = adUseClient
SQLbum = "UPDATE RUPS故障DB SET"
SQLbum = SQLbum & " 故障種別 = '" & FailureClassfication & "' , 項目No = '" & No & "' , 故障名(英語)= '" &FailureNameE & "' , 故障名(日本語)= '" & FailureNameJ & "' , 故障No = '" & FailureNo & "'"
SQLbum = SQLbum & " , バイパス切替 = '" & Bypass & "' , ユニット解列 = '" & Unit & "' , 現状維持 = '" & Continu& "' , システム停止 = '" & SystemDown & "' , アラーム = '" & Alarm & "' , ドライ接点出力 = '" & Dry & "' , 備考 =
'" & Note & "' , 有無 = '" & umu & "'"
SQLbum = SQLbum & " WHERE CStr([RUPS故障DB.一貫No]) = '" & ConsistentlyNo & "';"cnn.Execute (SQLbum)
cnn.Close 'データベースを閉じる。
Set cnn = Nothing 'オブジェクトも開放する。プロクラム-------------------------------------------------------------------------------------------------
アプリケーションエラー内容-------------------------------------------------------------------------------(1)
障害が発生しているアプリケーション名: R-UPS故障内容検索ソフトテスト.exe、バージョン: 1.0.0.0、タイム スタンプ:
0x55ab36a0
障害が発生しているモジュール名: msjet40.dll、バージョン: 4.0.9756.0、タイム スタンプ: 0x49246e48
例外コード: 0xc0000005
障害オフセット: 0x000508c3
障害が発生しているプロセス ID: 0x508
障害が発生しているアプリケーションの開始時刻: 0x01d0c218ae8c3833
障害が発生しているアプリケーション パス:
障害が発生しているモジュール パス: C:\Windows\system32\msjet40.dll
レポート ID: f256fc33-2e0b-11e5-bfcc-ecb1d7362b8c
(2)障害が発生しているアプリケーション名: R-UPS故障内容検索ソフト.exe、バージョン: 1.0.0.0、タイム スタンプ:
0x55876175
障害が発生しているモジュール名: ntdll.dll、バージョン: 6.1.7601.18798、タイム スタンプ: 0x5507b3c6
例外コード: 0xc0000005
障害オフセット: 0x000565f6
障害が発生しているプロセス ID: 0x3f4
障害が発生しているアプリケーションの開始時刻: 0x01d0c29c0b7c4465
障害が発生しているアプリケーション パス:
障害が発生しているモジュール パス: C:\Windows\SYSTEM32\ntdll.dll
レポート ID: 52e5b06e-2e8f-11e5-886b-4061868bf12cアプリケーションエラー内容-------------------------------------------------------------------------------
回答
-
ごもっともなアドバイス、有難うございます。
アクセスデータベースは共有で使用するため、サーバー側に置かないといけないのですが、アクセスデータベースを参照するアプリケーショーンは各クライアントPCに配置するようにしました。クライアント側にアクセスデータベースの所在フォルダをiniファイルに定義しておき、アプリケーションでそれを読み込むことでサーバーに設置しているアクセスデータベースに読み書きを行う構成としました。
いろいろと、具体他的なアドバイスをいただき、本当にありがとうございました。
今後ともよろしくお願いお願い致します。
- 回答としてマーク 星 睦美 2015年8月17日 4:17
すべての返信
-
VB6.0で作成したアプリケーションは、Windows7.0およびWindows2008R2移行では動作保証されていません。Microsoft Jet 4.0 データベース エンジン(Office 2003)の延長サポートは2014年4月8日で終了しました。正論を言うなら、早急にサポート期間に余裕のある新しい言語およびミドルウェアに移行しましょうって事になります。
もしどうしても移行する事が出来ないなら、自己責任でセキュリティパッチなどを適用せずに古いOS上で動作させるしか無いかと思います。お勧めはWindows 2008です。Office2003のサポートが終了しているのは如何ともし難いですが、OSはまだ延長サポート中なので。
甕星
-
exeファイルで実行すると、msjet40.dll、ntdll.dllエラーが発生しクラッシュしてしまいます。2015/7/17にできないことが発覚しました。それ以前は、問題なく起動していました。
可能性として、
『mdb が破損してしまい、特定のデータ領域にアクセスした際にクラッシュが誘発されてしまっている』
という状況を想像してみました。mdb の最適化は、適宜行っていますか?仮に破損だとしたら、今からの修復処理が正常に働くかどうかは保証できないので、新規 mdb に同じ構造のテーブルを用意し、そこに、該当テーブルの内容を移してみて、同じようにクラッシュするかどうかを確認してみては如何でしょう。(全データコピーで問題が出るなら、その一部を少しずつコピーしてみるなど)
VB6エディタで実行すると
開発環境であれば問題が出ないのであれば、《R-UPS故障内容検索ソフト》のコンパイルオプションを、ネイティブコンパイルから P-Code に変更してみては如何でしょうか。
タイム スタンプ: 0x55ab36a0
タイム スタンプ: 0x55876175これらはいわゆる UNIX タイムスタンプですね。それぞれ、
「2015/07/19 14:33:20」「2015/06/22 10:14:29」を表す時刻値でしょう。アプリケーションの開始時刻: 0x01d0c218ae8c3833
アプリケーションの開始時刻: 0x01d0c29c0b7c4465こちらは、Windowsファイルタイムスタンプ形式で、日時としては
「2015/07/19 20:47:25」「2015/07/20 12:27:45」かな…?例外コード: 0xc0000005
これは、一般保護例外 [STATUS_ACCESS_VIOLATION] ですかね。
障害オフセット: 0x000508c3
障害オフセット: 0x000565f6これらの値から、エラー発生箇所のアドレスを求められますが、
デバッグ情報が無い場合には、あまり意味が無さそうです。障害が発生しているプロセス ID: 0x508
/blockquote>
障害が発生しているプロセス ID: 0x3f4これは、タスクマネージャーのプロセスタブに表示される ID です。
-
→最適化を行いましたが状況は変わりません。
それまでは、最適化をあまり行っていなかったということでしょうか。
破損の有無はさておき、先にも述べたように『新規 mdb での検証』を行ってみてください。あるいは、エラーが確認されという17日よりも前に使われていた mdb を使って検証するのも良いかと思います。
そうすることで、「新規mdbでも起こるなら、環境依存あるいはデータ依存の問題」「特定のmdbのみで起こるなら破損の可能性」などのように、多少なりとも切り分けが進むかと思います。仮に環境問題だとすれば、他の OS 環境でテストしてみるのも有効でしょう。
→P-Codeでコンパイルしても状況は変わりません。(VB6エディタでは、起動するが、コンパイルするとエラーが生じる)
互換性モード設定によって、文字列照合などの動作が変化したり、エラーを生じたりすることがあるようです。VB6.EXE および 自作 EXE の互換性設定はどうなっていますか? (17日以前は動いていたのなら、今回の問題とは関係ないかもしれませんが…一応念のため)
http://hanatyan.sakura.ne.jp/patio/read.cgi?no=272
https://social.msdn.microsoft.com/Forums/ja-JP/524ca102-152e-409e-b2c3-4980c03decf7/vb6excel2013?forum=vbgeneralja https://social.technet.microsoft.com/Forums/ja-JP/0744c1ad-6904-465e-ac67-89cb0d5497ef?forum=w7itprogeneralja
https://social.msdn.microsoft.com/Forums/ja-JP/cacc15a1-effd-4ef7-87c0-c9b0d5a39f9c/strconv?forum=vbgeneralja -
下記サイトを参考に例外発生時にプロセス ダンプを生成する設定を行い、現象発生時のプロセス ダンプを採取して解析してみては?
-------------------------------------------
Windows7のWERでアプリケーションのクラッシュダンプを取得する方法
http://d.hatena.ne.jp/replication/20140427/1398575903
------------------------------------------- -
具体的なアドバイス、とても参考になりました。ありがとございます。
しかし、結果は、下記となりました。
クライアントPCでは、WindowsXP互換モード設定を行い、管理者権限を設定が行えるのですが、サーバーにexeを配置し互換モード設定を行おうとしても設定できません。
クライアントPCで互換モードを設定を行い、アクセスデータベースもクライアントPCに配置すると問題無くアクセスデータベースにインサート、アップデートが行えます。しかし、アクセスデータベースは共用で使用するためサーバー側に配置しないといけないので、サーバー側にexeを配置し互換モードを設定が行えないとNGです。
そこで、VB6のエディタ自体に互換モード設定を行いコンパイルすればよいと考えましたが、互換モードを変更すると、今度は、VB6エディターのソースコードが文字化けを引き起こしオブジェクト名が欠けたりして、コンパイル自体が行えない状態となりました。あと一歩まで来ていますが、なぜ、VB6エディタの互換モード設定を変更すると文字化けを起こすのか理解ができません。
ほかに、良い方法があるのでしょうか。ご教示下さい。
-
ごもっともなアドバイス、有難うございます。
アクセスデータベースは共有で使用するため、サーバー側に置かないといけないのですが、アクセスデータベースを参照するアプリケーショーンは各クライアントPCに配置するようにしました。クライアント側にアクセスデータベースの所在フォルダをiniファイルに定義しておき、アプリケーションでそれを読み込むことでサーバーに設置しているアクセスデータベースに読み書きを行う構成としました。
いろいろと、具体他的なアドバイスをいただき、本当にありがとうございました。
今後ともよろしくお願いお願い致します。
- 回答としてマーク 星 睦美 2015年8月17日 4:17