常駐プログラムからWindows終了時にMDBにデータ保存するには?

解決


はんぺん  2009-06-05 03:37:35  No: 101800

VB6の常駐プログラムの中で、ADOで接続したMDBデータを使用しています。

常駐させたままの状態で、Windowsの終了時や再起動時にMDBファイルにデータを保存させたいのですが、Accessが先に終了してしまうのか、QueryUnload内で保存実行できません。

Windows終了時や再起動時に、MDBに保存するということは無理なのでしょうか。
できるのであれば、方法を伝授いただきたいのですが。
よろしくお願いいたします。


魔界の仮面弁士  2009-06-05 09:16:54  No: 101801

> Accessが先に終了してしまうのか
ADO で接続するのとは別に、Access も起動させているのでしょうか? それは何のために?

> QueryUnload内で保存実行できません。
具体的には、どうなってしまうのでしょうか?

(1) 保存コードを実行する前に、アプリが終了してしまう。
(2) 保存コードを実行すると、エラーが発生してしまう。
(3) 保存コードを実行しても、データが保存されていない。
(4) その他

(1) の場合は、どこかに End ステートメントが紛れ込んでいないかを
確認してみてください。あるいは、サブクラス化を行っている場合に、
その後始末を忘れた場合にも、問題が発生する可能性があります。

(2) の場合は、どのようなコードを実行したときに、どのようなエラーが
発生したのかを提示してみてください。

(3) の場合、トランザクション処理を忘れていないかどうか確認してみてください。
理由は下記を参照。
http://www.canalian.com/workshop/access/JetCache.html

明示的に CommitTrans しても駄目な場合には、保存直前のデータを
MsgBox なり App.LogEvent なりで確認して、期待するデータを書き込もうと
しているかどうかを再チェックしてみてください。また、保存先の mdb の
パスを間違えていたり、Vista のリダイレクションが働いていたなどの
可能性も、念のために疑っておいた方が良いかもしれません。


GOD  2009-06-05 22:28:56  No: 101802

> QueryUnload内で保存実行できません。
>
情報がないので何ともいえません。

どうしても出来ないようなら、代替案として
1)Windows の終了を一旦キャンセル後、自アプリの終了処理を行い、完了後
    に Windows を終了する。
2)データをテキストファイル等に保存しておき、次回起動時にDBに登録する。
等が考えられます。


はんぺん  2009-06-06 10:57:22  No: 101803

早速のご返信ありがとうございます。
返答が遅くて申し訳ありません。

> Accessが先に終了してしまうのか
> ADO で接続するのとは別に、Access も起動させているのでしょうか? それは何のために?

Accessは起動させていません。VB6プログラム内からADO接続しているだけです。

> QueryUnload内で保存実行できません。
> 具体的には、どうなってしまうのでしょうか?

保存コードの途中で終了してしまいます。

途中の場所はいろいろで、MDBファイルの削除だったり、MDBファイルのデータベース初期化だったり、ツリー構造の書き出し中だったりします。
「ActiveXコンポーネントはオブジェクトを作成できません」とメッセージのでることもあります。

お尋ねしたいのは、Windosの終了時イベントが発生してから、データ保存をするということ自体が一般的でないというか、通常は用いられない尋常でない方法かではないかいうことです。

Windows終了時に常駐プログラムがすぐに終了できないときに、「XXXプログラムを終了しています」というプログレスバー付のダイアログが表示されると、それ以降ファイル等を扱うコードは実行されないのではないのかということなのですが。

解決策として、フォームを閉じる際にMDB保存を行い、常駐終了時に保存は行わないようにして回避していますが、Windows終了時保存のようなコードを書きたい場合、一般的にどのような処理をするものなのか知りたくて、お尋ねしたしだいです。
よろしくお願いいたします。


魔界の仮面弁士  2009-06-07 08:35:13  No: 101804

>>> Accessが先に終了してしまうのか
>> ADO で接続するのとは別に、Access も起動させているのでしょうか? それは何のために?
> Accessは起動させていません。VB6プログラム内からADO接続しているだけです。
?? 状況が良くわかりませんが、VB と無関係に起動した Access が先に終了したとしても、
アプリの動作には影響ないと思いますよ。VB から利用中の ADO 接続と Access はほぼ無関係ですし。

> お尋ねしたいのは、Windosの終了時イベントが発生してから、データ保存をするということ自体が一般的でないというか、通常は用いられない尋常でない方法かではないかいうことです。
終了時の保存処理は、一般的に行われていますので、それ自体は珍しい作業では無いと思います。
たとえば、メモ帳や Excel などを開いて編集している最中にアプリを再起動しようとすれば、
保存確認のメッセージが表示されますしね。

> Windows終了時に常駐プログラムがすぐに終了できないときに、
OS の終了時には、時間がかかる処理を行わない方が良いでしょう。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200604/06040049.txt


  2009-06-08 21:16:46  No: 101805

http://dobon.net/vb/dotnet/system/sessionending.html
ではどうですか?

でも何となく同じ気がしますが。。

>OS の終了時には、時間がかかる処理を行わない方が良いでしょう。
に同意です。


魔界の仮面弁士  2009-06-09 00:08:11  No: 101806

http://dobon.net/vb/dotnet/system/sessionending.html
> ではどうですか?

VB.NET ネタは隣の掲示板です。
今回の質問は VB6 の話なので、そのコードは使えないかと。


はんぺん  2009-06-09 08:44:53  No: 101807

いろいろなご提示ありがとうございます。
返信遅れてすいません。

ExitWindowsExって、実行するために手順が大変なんですね。
調べるのに手間取ってました。

それでなのですが、
Unloadをキャンセルして、ExitWindowsExで継続するとして、
最初にUnloadされたときにWindowsの終了モードが「シャットダウン」状態で実行されているのか「再起動」状態で実行されているのか取得する方法はないでしょうか。

だから、時間のかかる処理はしてはいかんのだというご意見もあると思うのですが、ここまでおつきあいいただいたついでに、そのあたりできるのかできないかご伝授いただけないでしょうか。
調べる方法がないかと思って、検索したのですが見つけられなかったもので。

よろしくお願いします。


GOD  2009-06-09 23:38:03  No: 101808

>Windowsの終了モードが「シャットダウン」状態で実行されているのか「再
>起動」状態で実行されているのか取得する方法
>
軽く調べた結果、昔は調べることができたみたいですが、XP SP2以降出来なくな
ったようです。(海外ページは余り見ていないのでもしかしたら方法があるかも知
れないのですが...)

参考までに
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200512/05120059.txt
http://technet.microsoft.com/en-us/library/cc962586.aspx


はんぺん  2009-06-10 05:44:17  No: 101809

ご伝授ありがとうございます。
私はかなりムキになって調べたのですが、手がかりも得られませんでした。

やはり、フォーム終了時に保存するのが一番確実のようですね。
いい勉強になりました。

長年頭の隅で懸案だったものが解決して、すっきりました。
皆さんのおかげです。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加