DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VB6 コモンダイアログボックス操作後のロック解除方法

環境/言語:[Windows XP/VB6]
分類:[VB6以前]

2005/10/21(Fri) 11:38:55 編集(投稿者)

 はじめまして。PG駆け出しレベルのものです。
 CommonDialogを利用してファイルをオープンする処理をしているのですが、
オープンした後、ファイルのあるディレクトリをプログラムが実行されている状態のまま移動しようとしても
「他の人あるいのプログラムによって使用されています」
 といった類のメッセージが出て移動をすることができません。
 処理の流れとしては

1)showOpenする
2)ファイル(ini形式)を選択し、「開く」挿下。
3)API(GetPrivateProfileSection)を利用して該当ファイルからデータを取得する
 (ファイル自体のオープンはこのAPI以外行っていません)
4)参照したファイルの存在するディレクトリ(App.pathではありません)を
 エクスプローラやデスクトップ上で移動を試行 <ここでメッセージが出ます

 CommonDialogでファイルを開くとカレントディレクトリが勝手に変更される
という記述を見たのでそれを修正してみましたが意味がなく、
APIに問題があるのだろうかとも思いましたがそういった資料はなかったので
どう対処すべきかわからない状態になっています。
「開く」を挿下した時点でハンドルか何かをprivateで保持されているのでしょうか?
 解決手段をご存知でしたらよろしければ御教授お願いいたします。
INIファイルを読み込むAPIのせいでロックされているのか、コモンダイアログのせいなのか切り分けできてるんでしょうか?

INIファイルを読み込む部分に問題があるんじゃないですか?
> 4)参照したファイルの存在するディレクトリ(App.pathではありません)を
>  エクスプローラやデスクトップ上で移動を試行 <ここでメッセージが出ます

普通に考えるとプロファイル操作でオープンクローズはないので、怪しくないですね。
#そのAPIで完結しているから
フォルダの移動ということなのでどのファイルがロックされているのかがわかればよいのでは。
支障がないのなら、エクスプローラでファイルを一つ一つ削除してみるとか。(ゴミ箱行きだし)

そのアプリケーションでフォルダ以下を操作しているところはないのでしょうか?
あと、場合によっては常駐アプリケーションも疑ってみましょう。
2005/10/21(Fri) 16:41:26 編集(投稿者)
2005/10/21(Fri) 16:38:26 編集(投稿者)
2005/10/21(Fri) 16:28:07 編集(投稿者)

 原因発覚しました。
 コモンダイアログもAPIも関係なかったようです(汗
 間接的にコモンダイアログが影響していましたが。

 コモンダイアログでファイル名の取得処理をした後Dir$を使用することでファイルの存在チェックを行っている部分があるのですが、Dir$の中でディレクトリ名が確保されてしまっているためロックがかかっている状態になっていたようです。
 まぁやりなれていない人間しかはまらないミスだと思いますが(汗)、一応原因となった流れを提示しておきます。


 1)コモンダイアログでファイルを選択、「開く」挿下
 2)1)の結果、カレントディレクトリがファイルのあった場所に変更される
 3)ファイルの存在チェックをLen(Dir$(... で行う。
   このためDir$にファイルの存在するカレントの場所が保存される。
 4)Dir$に確保されたファイル名リストを使わず、自分で合成してファイル名を作りこんでファイルの処理を行う。
 5)4)の結果、Dir$の中身が消費されずにカレントが抑えられたままになってしまう。
 6)カレントディレクトリを変更するAPIでカレントを変更してもDir$がファイルのあるディレクトリを参照してしまっているためロック(というか参照状態)になる。

 以上の流れが原因でした(汗

 通常End命令によって強制的にファイル・フォルダへの参照を解除することができますが、Endを使うとメッセージフックの周りの開放で不具合が出るためEndは使わずに作っていました。(Endを使用するとデバッグ時に正常に終了させてもVBごとダウンしてしまう)

 どたばたな乱文への対応ありがとうございましたm(_ _)m
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板