- 締切済み
フロッピー上のファイルクローズ時のメッセージ表示について
フロッピーへアクセスするDLLを作っています。 環境は、Window NT4.0 SP5 & C です。 フロッピー上のファイルへのアクセスが終わり CloseHandleを実行する前に、(微妙なタイミングだとは思いますが)媒体がFDDから抜かれてしまった場合、CloseHandle実行時に次のメッセージが表示されることがあります。 |-------------------------------------------------------------------- |システムプロセス - ディスクがありません。 | | ドライブにディスクがありません。ディスクをドライブ A:に挿入して下さい。| | 中止(A) 再試行(R) 無視(I) | |--------------------------------------------------------------------| ( ↑ ↑ ↑ 註:ボタンです。) このメッセージを表示せずにCloseHandleを行う方法をご存知でしたらご教示下さい。(メッセージを表示することなく、強引にハンドルをクローズしたり、あるいは、CloseHandleを即 異常終了させるような方法はあるのでしょうか?) よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- SpiralGalaxy
- ベストアンサー率39% (649/1653)
CloseHandle()でダイアログが表示されているのではなく、もう少し前の WriteFile() などで表示されているのではないでしょうか? WriteFile()が終わって CloseHandle()の手前でドンピシャリFDを抜くというのは神業のような気がします。 試しに SetErrorMode(...) を CreateFile()より前に入れて試してみてもらえますか?
- SpiralGalaxy
- ベストアンサー率39% (649/1653)
SetErrorMode(SEM_FAILCRITICALERRORS)でうまくいきませんかね?またはパラメータはもしかしたらSEM_NOOPENFILEERRORBOX かも…。試していませんが…。 致命的エラーをOSに任せず、エラーコードが返ってくるので該当メッセージが表示されず、自分でどうにかできると思うのですが…。その場合でも#1の方の言われるようにエラーを無視せず、なんらかのエラー処理は必要と思います。
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 このダイアログが出ると言うことは、ファイルが正常にクローズしていないと言うことなので 次のときファイルが正常にオープンできないことがあります。 それでも、良いのでしょうか? もし、良いのであれば、ファイルをオープンからCloseHandleまでの間を例外処理するようにすれば ダイアログが出なくなるかもしれません。 ちょっと、試していないので憶測になりますが。
お礼
回答頂きありがとうございます。 次のときのファイルオープンが正常にいかなくても構いません。 とりあえず、ダイアログを表示せずCloseHandleを行いたいです。 例外処理の書き方に自信がないのですが、下記のように書いてみました。 が...残念ながらダイアログは表示されてしまいました。 catchの中にも入らないので、 例外処理の書き方に問題があるのでしょうか?御指摘頂ければ幸いです。 HANDLE hFD; UINT uErrMode; BOOL bRet; BYTE bData[84480]; DWORD dwReadSize; DWORD dwFileSize; DWORD dwFilePoint; 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エラー }
お礼
回答ありがとうございます。 “まさしくこれだ!!!”と思ったのですが.... 残念ながら、メッセージは表示されてしまいました。(T_T) SEM_FAILCRITICALERRORS指定でも表示され、SEM_NOGPFAULTERRORBOX指定でも表示されてしまいました。 MSDNライブラリにあった4つの指定をすべて指定してみたのですが表示されてしまいました。(ダメモトでお礼1に書いた例外処理を(書き方に自信がなかったので)削除してやってみたのですがやはり表示されてしまいました。)