• ベストアンサー

CreateFileの後始末

hFile=CreateFileの戻り値が hFile==INVALID_HANDLE_VALUEのときに CloseHandle(hFile)を実行しなくていいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 はい。  クリエイトされてませんので不要です。  やったら返ってマズいのでは?(^_^;  CloseHandle() 関数は、無効なハンドルを渡すと無限ループにハマってハングアップしますので、その意味で注意が必要です。

keyguy
質問者

お礼

ありがとうございます。 Javaのように自動的に後始末してもらいたい者ですね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CreateFileしてからtruncate

    ファイルデータを置換するプログラムを作っています。 短い文字に置換すると、ファイルサイズは小さくなります。 ところが、今のソースではファイルサイズ小さくなりません。 「abcdefg」のテスト中の「cde」を「H」に置換すると 「abHfgxx」になってしまいます。 ・hfile = CreateFile("test.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ・読む ・置換 ・上書き ・CloseHandle(hfile); というステップです。 ・読む の直後に、text.txtを0バイトにしたいんですが、 hfileを閉じないで、Perlのtruncateのようなことはできませんか?

  • CreateFileしてもうまくいきません・・。

    シリアルポートで通信するためのプログラミングを始めたばかりなのですが、COMポートのオープンが成功しません。 以下を実行しているのですが、何が間違いでしょうか? ちなみに、PCMCIAに挿入したPCカードから通信したいと考えています。単純に"COM1"というのであっているのかも分かりません・・。 よろしくお願いします。 void CMyDlg::OnReset() { HANDLE hCom; hCom = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED NULL ); if(hCom == INVALID_HANDLE_VALUE){ MessageBox("ポートオープン失敗"); } else{ MessageBox("ポートオープン成功"); } }

  • CreateFile関数を用いたファイル作成について

    VisualC++のCreateFile関数を用いて「作成日時が1週間前であれば ファイルをリネームして保存後、以前のファイル名で 空ファイルを作成する」という処理を作っています。 (作成中の関数の抜粋) /* リネーム処理 */ ret_code = MoveFile(logfile_path, rename_path); if(ret_code == API_NG){ return(NG); } /* 以前と同じ名前でファイルを新規作成 */ hfile = CreateFile(logfile_path, GENERIC_WRITE,FILE_SHARE_WRITE, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, FILE_FLAG_NO_BUFFERING); if( hfile == INVALID_HANDLE_VALUE ) { return(NG); } CloseHandle(hfile); } return(OK); } リネームする以前と同じ名前でファイルを作成すると ファイルの作成日時がリネームする以前の作成日時になってしまいます。 (例) 4月1日に「aaa.txt」を作成→ 4月8日に「aaa_0401.txt」にリネーム後、新規に「aaa.txt」を作成すると 作成日時が「4月1日」になってしまう。 Microsoftのページによると、キャッシュファイルの情報を取得しているために 以前の作成日時にてファイルが作成されてしまうようです。 http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_createfile.htm 原因は分かったのですが、対処方法が思い浮かびません。 上記問題を解決するにはどういった方法がありますでしょうか? ご教授をよろしくお願いします。

  • WinAPIでのファイル操作について教えて下さい。

    現在参考書やwebサイトと参考にWindowsプログラミングを学んでいます。 下記のサイトにあるファイル作成のソースをコンパイルして実行したのですが http://wisdom.sakura.ne.jp/system/winapi/win32/win111.html #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow) { HANDLE hFile; hFile = CreateFile( lpCmdLine , GENERIC_READ , 0 , NULL , CREATE_NEW , FILE_ATTRIBUTE_NORMAL , NULL ); if (hFile == INVALID_HANDLE_VALUE) { MessageBox( NULL , TEXT("ファイルを作成できません") , TEXT("エラー") , MB_OK ); return 1; } CloseHandle(hFile); return 0; } コンパイルは成功するのですが実行すると必ずエラーになります。 他のソースも同様にファイル操作に失敗した場合の表示が行われます。 自分が持っている参考書にはファイル操作についてあまり詳しく書かれていないので他のソースも試せません。 どなたか教えて下さいよろしくお願いします。

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

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

  • CreateFile関数でCOMポートが開けない

    以下の手順でCOMポートをオープンすると、(4)のCOMオープンが必ず失敗します。 GetLastError関数でエラーコードを取得するとERROR_FILE_NOT_FOUNDが返ってきました。 心優しい方、(4)のCOMオープンを成功させる方法を教えていただけないでしょうか? (1)CreateFile関数でCOMポートをオープンし、オープン中にUSBを抜き差しする。 (2)PurgeComm関数で送受信バッファをクリア (3)CloseHandle関数でCOMポートのハンドルをクローズ (4)CreateFile関数でCOMポートを再度オープン←NG 以上、どうぞよろしくお願いいたします。

  • exeファイルにドラッグすることで動作するプログラム再質問

    前回、exeファイルにドラッグすることで動作するプログラムというタイトルで質問したものです。いといろやっていたら上手くいったと勘違いし、質問を締め切ってしまいました。実は上手くいっておらず、再度質問させていただきます。お手数をお掛けし申し訳ございませんが宜しくお願い申し上げます。 現在上手くいかないプログラムは以下のようなものです(具体的処理は省いています) #include <windows.h> #include <tchar.h> int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ HANDLE hfile; hfile = CreateFile(lpCmdLine,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL); if(hfile == INVALID_HANDLE_VALUE){ MessageBox(NULL,_T("error"),NULL,MB_OK); return false; } //ここで処理をします(今回は省略させていただきました) return 0; } このプログラムのexeファイルのアイコンにデータファイルをドラッグし、処理を行いたいのですが、データファイル名に日本語が含まれると hfile が INVALID_HANDLE_VALUEとなります。 データファイル名が英字のみの場合は上手くいきます。文字セットはUnicode文字セットを使用しています。 どなたかご教授お願い申し上げます。

  • アクセス権のチェック方法について

    あるフォルダ以下に、ユーザ毎にアクセス権が設定されたファイルがあり、指定したユーザが指定ファイルを読むことができるかをチェックするツールを作りたいと考えています。 APIを見ていて、LogonUser、ImpersonateLoggedOnUserを使ってチェックするユーザで偽装し、CreateFileでチェックするファイルを開けばよいかと思い、下記のようなコードを試しました。 ----- HANDLE hToken = NULL; HANDLE hFile = NULL; PTSTR pszUserName = "testuser"; PTSTR pszDomainName = "." PTSTR pszPassword = "testuser"; PTSTR pszFilePath = "C:\\test\\dir01\\001.txt"; try { { if (!LogonUser(pszUserName, pszDomainName, pszPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken)) { printf("error:%d\n",GetLastError()); goto leave; } hFile = CreateFile(pszFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, SECURITY_SQOS_PRESENT | SECURITY_EFFECTIVE_ONLY, NULL); if (hFile == INVALID_HANDLE_VALUE) { printf("error2:%d\n",GetLastError()); } else { printf("OK\n"); } } } leave:; } catch(...) {} ----- 実行するとLogonUser、ImpersonateLoggedOnUserは成功しているようですが、セキュリティの有無にかかわらずすべてのファイルがCreateFileに成功してしまいます。 読み取り権限が無いファイルに対してはCreateFileは失敗すると思っていましたが違うのでしょうか? それとも、セキュリティをチェックする方法として根本的に間違っています?? 情報をお待ちしております。 環境は以下の通りです。 Win2000 SP4 VisualStudio6(VC++)

  • CloseHandle以外でファイルを閉じる方法

    CreateFileでファイルをオープンした後、うっかりCloseHandleせずにプログラムを終了してしまったとします。 するとそのファイルは、Windowsを再起動するまで、削除できなくなりますよね。 これを、再起動せずにクローズする方法ってないもんでしょうか? もう一度プログラムを実行しても、ハンドルオープンしたままですから、当然CreateFileも失敗しますし……。 よくファイル操作するプログラムを作るのですが、しょっちゅうCloseHandleし忘れて再起動するハメになるので、再起動なしでクローズできる方法があれば非常にありがたいのです。 やっぱり、素直に再起動するしかないんでしょうか。

  • 【C言語】引数にファイルパスを送りたい

    DLLで外部のファイルサイズを得る関数を作っています。 C言語は書きながら覚えていこうとしているのですが、 どうしても分からない点がありました。 ソースをここに正しく書ける自信がないので日本語を含めて大体で書きます。 いろいろなサイトのコピペです。 double __stdcall filesize(){ HANDLE hFile; DWORD size; hFile = CreateFile( _T(絶対パス, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); size = GetFileSize( hFile, NULL ); CloseHandle( hFile ); return(size); } このような感じで書いていて最後にretuenでファイルサイズを正しく得ることができました。 この絶対パスは環境によって変わるので引数にしようと考えました。 そしてfilesize()の中にどのように記述すればいいかで躓いています。 filesize(絶対パス){ char pass[] = "絶対パス"; hFile = CreateFile( _T(pass, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); こんな感じで書ければいいのですがC言語はポインタや文字列の扱いが難しいですね。 初歩的なことで申し訳ありませんがよろしくお願いします。

usbからプリントしたい
このQ&Aのポイント
  • usbからプリントしたい方法についての質問です。
  • コンビニのコピー機を使ってusbから印刷したいができない問題についての質問です。
  • ノートパソコンを使ってusbからプリントしたいがうまくいかない状況についての質問です。
回答を見る