OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

フロッピー上のファイルクローズ時のメッセージ表示について

  • すぐに回答を!
  • 質問No.176581
  • 閲覧数145
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 50% (3/6)

フロッピーへアクセスするDLLを作っています。
環境は、Window NT4.0 SP5 & C です。
フロッピー上のファイルへのアクセスが終わり CloseHandleを実行する前に、(微妙なタイミングだとは思いますが)媒体がFDDから抜かれてしまった場合、CloseHandle実行時に次のメッセージが表示されることがあります。

|--------------------------------------------------------------------
|システムプロセス - ディスクがありません。               |
| ドライブにディスクがありません。ディスクをドライブ A:に挿入して下さい。|
|   中止(A) 再試行(R) 無視(I)                    |
|--------------------------------------------------------------------|
   ( ↑    ↑    ↑   註:ボタンです。)


このメッセージを表示せずにCloseHandleを行う方法をご存知でしたらご教示下さい。(メッセージを表示することなく、強引にハンドルをクローズしたり、あるいは、CloseHandleを即 異常終了させるような方法はあるのでしょうか?)

よろしくお願いします。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全3件)

  • 回答No.1
レベル12

ベストアンサー率 45% (210/459)

こんにちは。itohhといいます。 このダイアログが出ると言うことは、ファイルが正常にクローズしていないと言うことなので 次のときファイルが正常にオープンできないことがあります。 それでも、良いのでしょうか? もし、良いのであれば、ファイルをオープンからCloseHandleまでの間を例外処理するようにすれば ダイアログが出なくなるかもしれません。 ちょっと、試していないので憶測になり ...続きを読む
こんにちは。itohhといいます。

このダイアログが出ると言うことは、ファイルが正常にクローズしていないと言うことなので
次のときファイルが正常にオープンできないことがあります。
それでも、良いのでしょうか?

もし、良いのであれば、ファイルをオープンからCloseHandleまでの間を例外処理するようにすれば
ダイアログが出なくなるかもしれません。
ちょっと、試していないので憶測になりますが。
お礼コメント
bow2001

お礼率 50% (3/6)

回答頂きありがとうございます。

次のときのファイルオープンが正常にいかなくても構いません。
とりあえず、ダイアログを表示せずCloseHandleを行いたいです。

例外処理の書き方に自信がないのですが、下記のように書いてみました。
が...残念ながらダイアログは表示されてしまいました。
catchの中にも入らないので、
例外処理の書き方に問題があるのでしょうか?御指摘頂ければ幸いです。


HANDLE hFD;
UINTuErrMode;
BOOLbRet;
BYTEbData[84480];
DWORDdwReadSize;
DWORDdwFileSize;
DWORDdwFilePoint;

try
{
 hFD = CreateFile( "\\\\.\\a:\\aaa.doc",
           GENERIC_READ | GENERIC_WRITE,
           FILE_SHARE_READ | FILE_SHARE_WRITE,
           NULL,
           OPEN_EXISTING,
           FILE_ATTRIBUTE_NORMAL,
           NULL );
 if( hFD == INVALID_HANDLE_VALUE ){
  // エラー
 }
 dwFileSize = GetFileSize( hFD, NULL );

 bRet = ReadFile( hFD, (LPVOID)bData, dwFileSize, &dwReadSize, NULL );
 if( bRet == FALSE ){
  // エラー
 }

 dwFilePoint = SetFilePointer( hFD, 0, NULL, FILE_BEGIN );
 dwFileSize += 10;
 bRet = WriteFile( hFD, (LPVOID)bData, dwFileSize, &dwReadSize, NULL );
 if( bRet == FALSE ){
  // エラー
 }
 uErrMode = SetErrorMode( SEM_NOOPENFILEERRORBOX | SEM_NOALIGNMENTFAULTEXCEPT | SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX );
 if( !CloseHandle( hFD ) ){
  throw "Test";
 }
 SetErrorMode( uErrMode );
}
catch(char * str)
{
 SetErrorMode( uErrMode );
 // CloseHandleエラー
}
投稿日時 - 2001-11-29 15:24:10
  • 回答No.2
レベル13

ベストアンサー率 39% (632/1595)

SetErrorMode(SEM_FAILCRITICALERRORS)でうまくいきませんかね?またはパラメータはもしかしたらSEM_NOOPENFILEERRORBOX かも…。試していませんが…。 致命的エラーをOSに任せず、エラーコードが返ってくるので該当メッセージが表示されず、自分でどうにかできると思うのですが…。その場合でも#1の方の言われるようにエラーを無視せず、なんらかのエラー処理は必 ...続きを読む
SetErrorMode(SEM_FAILCRITICALERRORS)でうまくいきませんかね?またはパラメータはもしかしたらSEM_NOOPENFILEERRORBOX かも…。試していませんが…。

致命的エラーをOSに任せず、エラーコードが返ってくるので該当メッセージが表示されず、自分でどうにかできると思うのですが…。その場合でも#1の方の言われるようにエラーを無視せず、なんらかのエラー処理は必要と思います。
お礼コメント
bow2001

お礼率 50% (3/6)

回答ありがとうございます。

“まさしくこれだ!!!”と思ったのですが....
残念ながら、メッセージは表示されてしまいました。(T_T)

SEM_FAILCRITICALERRORS指定でも表示され、SEM_NOGPFAULTERRORBOX指定でも表示されてしまいました。
MSDNライブラリにあった4つの指定をすべて指定してみたのですが表示されてしまいました。(ダメモトでお礼1に書いた例外処理を(書き方に自信がなかったので)削除してやってみたのですがやはり表示されてしまいました。)
投稿日時 - 2001-11-29 17:41:41
  • 回答No.3
レベル13

ベストアンサー率 39% (632/1595)

CloseHandle()でダイアログが表示されているのではなく、もう少し前の WriteFile() などで表示されているのではないでしょうか? WriteFile()が終わって CloseHandle()の手前でドンピシャリFDを抜くというのは神業のような気がします。 試しに SetErrorMode(...) を CreateFile()より前に入れて試してみてもらえますか?
CloseHandle()でダイアログが表示されているのではなく、もう少し前の WriteFile() などで表示されているのではないでしょうか? WriteFile()が終わって CloseHandle()の手前でドンピシャリFDを抜くというのは神業のような気がします。

試しに SetErrorMode(...) を CreateFile()より前に入れて試してみてもらえますか?
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ