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

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


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

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

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



試しに SetErrorMode(...) を CreateFile()より前に入れて試してみてもらえますか?
    • good
    • 0

SetErrorMode(SEM_FAILCRITICALERRORS)でうまくいきませんかね?またはパラメータはもしかしたらSEM_NOOPENFILEERRORBOX かも…。

試していませんが…。

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

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

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

SEM_FAILCRITICALERRORS指定でも表示され、SEM_NOGPFAULTERRORBOX指定でも表示されてしまいました。
MSDNライブラリにあった4つの指定をすべて指定してみたのですが表示されてしまいました。(ダメモトでお礼1に書いた例外処理を(書き方に自信がなかったので)削除してやってみたのですがやはり表示されてしまいました。)

お礼日時:2001/11/29 17:41

こんにちは。

itohhといいます。

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

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

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

次のときのファイルオープンが正常にいかなくても構いません。
とりあえず、ダイアログを表示せず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

このQ&Aに関連する人気のQ&A

sem」に関するQ&A: プログラミング

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC++とC#

C,C++と進みC#
Visual C#がありますが
C++とC#の違いを教えてください.
C++とJAVAをたしたようなもの
なのでしょうか?

Aベストアンサー

文法/構文上の類似点は多々ありますが、「別物」です。
その相違について掲示板で列挙できるものではありません。
# 本を読んでください。

Qls | sort を実行するプログラム

以下のプログラムはls | sortを実行するプログラムなのですが、出力が2回ずつ出てしまい困っております。以下に実行結果も載せましたので参照ください。



#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

main(int argc,char **argv){
int a[2],b[2];
int cint,status;
char n;
pid_t pid1,pid2;

if(pipe(a)==-1){
perror("pipe");
exit(EXIT_FAILURE);
}

if(pipe(b)==-1){
perror("pipe");
exit(EXIT_FAILURE);
}

if((pid1 = fork())==-1){
perror("fork");
exit(EXIT_FAILURE);
}

if((pid2 = fork())==-1){
perror("fork");
exit(EXIT_FAILURE);
}

//子1
else if(pid1==0){
close(a[0]);
close(b[0]);
close(b[1]);
dup2(a[1],1);
close(a[1]);
execlp(argv[1],argv[1],(char *)0);
}

//子2
else if(pid2==0){
close(a[1]);
close(b[0]);
dup2(a[0],0);
dup2(b[1],1);
close(a[0]);
close(b[1]);
execlp(argv[2],argv[2],(char *)0);
}

//親
else {
close(a[0]);
close(a[1]);
close(b[1]);
wait(&status);
while((read(b[0],&n,1))==1){
putchar(n);
}
close(a[0]);
}
exit(EXIT_SUCCESS);
}

/*実行結果
$ ./pipesort ls sort
2^31-1.c~
2^31-1.c~
a*b.c~
a*b.c~
a-z.c
a-z.c
a-z.c~
a-z.c~
a-z1.c
a-z1.c
a-z1.c~
a-z1.c~
a.c
a.c
a.c~
a.c~
a.out
a.out
a.sp~
a.sp~
a10
a10
*/
というように同じファイル名が二度ずつ出力されるのです。これを出力は一度ずつにしたいのですがどのようにすればよいですか?

以下のプログラムはls | sortを実行するプログラムなのですが、出力が2回ずつ出てしまい困っております。以下に実行結果も載せましたので参照ください。



#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

main(int argc,char **argv){
int a[2],b[2];
int cint,status;
char n;
pid_t pid1,pid2;

if(pipe(a)==-1){
perror("pipe");
exit(EXIT_FAILURE);
}

...続きを読む

Aベストアンサー

挙げられたプログラムの流れを追っていくことにします:
まず
pid1 = fork()
により親プロセスと子プロセス (子1) ができます. その次の
pid2 = fork()
では pid1 のチェックをしていないので, 親プロセスと子1プロセスの両方がこの fork を行います. その結果, 親プロセスが fork した子1, 子2 の他に子1 が fork した孫プロセスができます.
それぞれのプロセスが持つ pid1, pid2 の値は
・親:pid1 != 0, pid2 != 0
・子1: pid1 == 0, pid2 != 0
・子2: pid1 != 0, pid2 == 0
・孫: pid1 == 0, pid2 == 0
です. そのあと pid1 == 0 であるプロセスが ls を実行するのですが, 子1 だけでなく孫プロセスもこの条件を満たします. つまり, 2つのプロセスが ls を独立に実行します.
これらの出力は pid2 == 0 であるプロセス (子2) により sort に送られます. pid2 == 0 という条件だけでは孫プロセスもヒットしそうですが, これは既にこの前で exec しているので関係ありません.
最後に残った親プロセスが, sort の出力を引き取って表示します.
つまり ls が 2回実行され, その出力を sort して表示するために「同じファイル名が二度ずつ出力される」という現象が起きています.
子1 の部分を前にもってくると, 子1 が exec してしまうためそのあとの pid2 = fork() は無関係で, ls と sort が 1つずつ実行されます.

挙げられたプログラムの流れを追っていくことにします:
まず
pid1 = fork()
により親プロセスと子プロセス (子1) ができます. その次の
pid2 = fork()
では pid1 のチェックをしていないので, 親プロセスと子1プロセスの両方がこの fork を行います. その結果, 親プロセスが fork した子1, 子2 の他に子1 が fork した孫プロセスができます.
それぞれのプロセスが持つ pid1, pid2 の値は
・親:pid1 != 0, pid2 != 0
・子1: pid1 == 0, pid2 != 0
・子2: pid1 != 0, pid2 == 0
・孫: pid1 == 0, pid2 ==...続きを読む

QC#とC++/CLIの連携について

C#とC++/CLIの連携について
C++/CLI側にC#で作成した変数を渡したいのですが、やり方がわかりません。

そもそも一つのソリューションにC++/CLIとC#を混在することはできるのでしょうか。
やはりC++/CLI側はDLLにして、C#がそのDLLを利用するのでしょうか。

Aベストアンサー

.NETの各種言語は混在することができます。
たとえば、C#でGUIの設計をし.NET用DLLを作成し、内部処理をC++でWin32APIを使って書き、C++/CLIでラップして、GUIと結び付ける、とかもできます。

「変数を渡す」というのが表現として良く分かりませんが、変数というよりはクラスを共有する感じになるかと思います。

とはいえC++/CLIはネイティブコードとマネージドコードを混ぜれるがゆえに、逆に色々と問題があるので、ちゃんとネットや本で調べたほうが良いかと思います。

QCloseHandleのエラーについて

現在、VC++6.0、winXP SP2でRS232Cを使った通信プログラムを作っています。
プログラム自体はできたのですが、異常系のテストをしようとして困っています。

CloseHandle()で、COMポートを閉じるのに失敗した場合、ポートの状態がどうなるのかを知りたいのですが、私が探した限り、ネットには失敗例が載って折らず、困っています。

ご存知の方がいらっしゃいましたら、ご教授願います。

Aベストアンサー

>オープンしたポートをPCから抜いたりしたのですが、
>普通にクローズしてしまったので
COMはあんまりやったことありませんが、
それは、ポートが物理的にいきなり抜かれたからといって、
Windows上で動作していているプログラムが開いているハンドルが
いきなり無効になるわけではないからでしょう。

普通は開いているハンドルを元に、GetCommStateとかで
状態を確認してから、クローズとかをする必要がある気がします。
ステータス取得失敗の理由も恐らく、GetLastErrorなどで取れる
気がしますし。。。

QC++ C# 語源

C++とC#(C++++)はかなり大雑把に言うとCの拡張版ですが、なぜ+が二個単位なのでしょうか。
C → C++ → C#
C+とC+++は存在しないのでしょうか。
C → C+ → C++ → C+++ → C#
もし存在しないのであれば、どのような理由でそうなったのでしょうか。

Aベストアンサー

C/C++のインクリメント演算子が、++だからじゃないでしょうか。

QCreateFile、CloseHandleの繰り返しで戻りが遅くなる

CreateFile、CloseHandleを繰り返し使用していると、CreateFileの戻りが極端に遅くなる(数秒)現象がありました。原因および対処方法を教えてください。お願いします。(WindowsXP SP2、VC.NET)

Aベストアンサー

補足いただいたサンプルを若干書き換えて、以下のコードで試してみました。CreateFileとCloseHandleの実行時間を簡易的に測定し、実行完了時にその最大値をミリ秒単位で表示するようになっています。

void CmfctestDlg::OnBnClickedButton1()
{
   DWORD dwCreateFile = 0;
   DWORD dwCloseHandle = 0;
   HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
   int i;
   for (i = 0; i < 10000; ++i) {
      WaitForSingleObject(hMutex, INFINITE);
      DWORD dw1 = GetTickCount();
      HANDLE hFile = CreateFile(
         "c:\\tmp\\test.txt",
         GENERIC_READ | GENERIC_WRITE,
         FILE_SHARE_READ | FILE_SHARE_WRITE,
         NULL,
         OPEN_EXISTING,
         0,
         0
         );
      if (hFile == INVALID_HANDLE_VALUE) {
         MessageBox("ouch!");
         break;
      }
      DWORD dw2 = GetTickCount();
      CloseHandle(hFile);
      DWORD dw3 = GetTickCount();
      ReleaseMutex(hMutex);
      if (dw2 - dw1 > dwCreateFile) {
         dwCreateFile = dw2 - dw1;
      }
      if (dw3 - dw2 > dwCloseHandle) {
         dwCloseHandle = dw3 - dw2;
      }
   }
   CString s;
   s.Format("CreateFile %d, CloseHandle %d", dwCreateFile, dwCloseHandle);
   MessageBox(s);
}

手抜きのためMFCを使ったのでMessageBoxとかCStringのあたりがナントモですが、大意は変わっていないかと思います。

これをWindows XP Professional SP2とWindows 2000 Professional SP4の上で動かしてみましたが、いずれもCreateFile, CloseHandleの実行時間の最大値は10ms~20ms程度になりました。

数秒も遅れる可能性があるのはWaitForSingleObjectのほうが高いような気がしますが、「他スレッド」のほうでMutexを長期間掴んでいるという可能性はないでしょうか。これについても、上記と同様の方法でWaitForSingleObjectの実行時間を測定すればハッキリするかと思います。

補足いただいたサンプルを若干書き換えて、以下のコードで試してみました。CreateFileとCloseHandleの実行時間を簡易的に測定し、実行完了時にその最大値をミリ秒単位で表示するようになっています。

void CmfctestDlg::OnBnClickedButton1()
{
   DWORD dwCreateFile = 0;
   DWORD dwCloseHandle = 0;
   HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
   int i;
   for (i = 0; i < 10000; ++i) {
      WaitForSingleObject(hMutex, INFINITE);
      DWORD dw1 = ...続きを読む

QC#でできてC++でできないことは?(C#のメリットとは?)

これから新しい言語として、C#もしくはC++の勉強をしたいと
考えています。

C#にできてC++にできないこと、あるいはその逆でC++にはできて
C#ではできない。ということがあれば、教えていただけないでしょうか?

感覚としてはC++であれば何でもできるという感じではあるのですが、
C#を使うメリットってどんなことがありますか?
やはり、ビジュアル開発(コントロールのDrag&Dropで画面開発ができる)
の簡単さというところがC#でのメリットでしょうか?

ちなみに私はこれまで、C -> VB -> Java といった順で言語を習得
してきました。

Aベストアンサー

>C#にできてC++にできないこと
無いでしょう。
基本的にC/C++の場合コンパイラの種類に依りますが
内部にアセンブラを書くこともできますから
C/C++で出来ないことはC#でも出来ません。
(勿論#1さんの言われるように言語レベルの仕様で出来ない事はあります。)

簡単さでいうとC#です。VB6の開発経験があるとのことですが
VC#だとVBのフォームを作成するような感じでインターフェースを
作っていけます。(一応VC++でも可能)

一方C#で出来ないことですが
当然ですがフレームワークに依存しないソフトを作る事が出来ません。
Javaで作ったソフトがJREを必要とするのと同じです。
他にはCPUの特殊な命令(SSEやMMX)を呼び出すとかドライバの開発等も出来ません。

ちなみにVC++でもフレームワークは使えるので
フレームワークのガベージコレクション等を使うことは可能です。
(ただフレームワークを使うならC#の方が簡単です。)

Qプログラム実行時にわからないエラーメッセージが出ました

書いたプログラムをcygwinでコンパイルし実行してみたのですが
数値を入力していくと次のようなエラーメッセージが出ました。
エラーの意味と、可能なら解決法をおしえていただきたいです。
よろしくお願いします。

12 [main] so 3092 _cygtls::handle_exceptions: Error while dumping state (
probably corrupted stack)
Segmentation fault (core dumped)

Aベストアンサー

スタックオーバーフローとかではないですか?

解決方法については、問題が発生したソースを提示してもらわないとどうしようもありません。

QC#でCのコンソール出力の取得

C#でCのコンソール出力の取得
Cで作成したDLLをC#で利用しています。このときDLLファイルはC言語のprintfを使用しています。この出力内容を取得して、C#でテキストボックス等に表示する方法はありませんでしょうか。

Aベストアンサー

使ったこと無いのですが
Googleで調べたところ以下のWebページがヒットしました。

@IT
.NET TIPS
コンソール・アプリケーションの出力を取り込むには?[C#、VB]
http://www.atmarkit.co.jp/fdotnet/dotnettips/657redirectstdout/redirectstdout.html

参考URL:http://www.atmarkit.co.jp/fdotnet/dotnettips/657redirectstdout/redirectstdout.html

Qwin32api ゲストに実行されるとファイルにアクセスできない

win32api ゲストに実行されるとファイルにアクセスできない

現在win32apiでアプリケーションを開発しています。

そのアプリケーションを管理者に実行された場合はいいのですが、ゲストに実行されるとprogram file内にあるファイルにアクセスできなくなってしまします。

そのファイルのアクセス権をゆるくもできますが、できればそのファイルを非管理者のユーザーにいじってほしくないのです。
プログラムからはファイルにアクセスしたいけど、非管理者のユーザーからはそのファイルを保護したい、なんてことは無理でしょうか?

回答よろしくお願いします。

Aベストアンサー

念のために補足しておきますが、クライアント・サーバ型にしてサーバ側がファイルをいじる、という形であればサーバにファイルアクセスの権限があればクライアントプログラムから書き換えられる「ように見せかける」ことはできます。


人気Q&Aランキング

おすすめ情報