「Windows API」の版間の差分

ファイルの入出力について
(GetWindowText() 関数)
(ファイルの入出力について)
 
</source>
 
なおコード中の「WindowsProject1」および大文字「WINDOWSPROJECT1」の部分にはファイル名が入っている。なので、ほかのファイル名の場合(たとえば「win32_test」)は、そのファイル名(「win32_test」および「WIN32_TEST」)に書き換わっている。
 
なので、「WindowsProject1」以外のファイル名の場合には、上記のコードをそのままコピーしてコンパイルを試しても、コンパイルエラーになる。
 
よく分からなければ、Visual Studioのウィザードで自動作成すれば済む。
 
 
 
=== 「Windows デスクトップアプリケーション」の使い方 ===
 
上述のこれらのコードを記述すれば、エディットボックスの入力結果を、ウィンドウに表示できます。
 
 
== ファイルの入出力 ==
簡単な方法を言う。
 
ウィザードで自動作成したコードに、ファイル入出力のコードを追記するのが、簡単である。
:(※ 白紙状態のコードから作る方法では、当ページの巻末の参考文献にあるネット上にある手本のコードが、そのコードのバージョンが古いなどの理由で、現在のWindowsでは使えないので、自分で調べなおす必要が生じる。2018年9月1日に確認。)
 
 
さて、たとえば、「test.txt」というファイルを作成したい場合なら、
 
<source lang=c>
// TODO: ここにコードを挿入してください。
</source>
の下に、下記のように書き加える。
 
<source lang=c>
// TODO: ここにコードを挿入してください。
 
HANDLE hFile;
 
hFile = CreateFile(
TEXT("test.txt"), 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);
 
</source>
 
ウィザードの自動作成したコードに上記コードを追加したコードを、コンパイルする。
 
成功すれば、特にメッセージは表示されないが、パソコンでソースコードのあるフォルダに、「test.txt」というファイルが加わっているのが分かる。
 
:( たとえばファイル名がWindowsProject1 なら WindowsProject1.cpp などがソースコードであり、これのあるフォルダに、一緒に「test.txt」というファイルが加わっている。
 
この「test.txt」は拡張子のとおり、通常のテキストファイルであるので、test.txt のアイコンをダブルクリックするなどして開くと、文字を書き足したり保存することもできる。
 
 
 
上述のコードのように、Win32API用の、無印C言語のファイル入出力関数ではない(つまり<code>fopen</code>などではない)、ファイル入出力の関数がある。
 
 
C言語のfopenなども、stdio.h をインクルードすればWin32APIでも使用可能であるが、しかし、TCHAR型の扱いの際に、特殊な操作が必要になってしまう。
 
なので、Win32APIでは、なるべく<code>CreateFile</code>などのウィンドウズAPI用のファイル関数を使うほうが簡単である。
 
 
 
なお、Win32 API にかぎらず、
 
一般に、ファイルの入出力のプログラミングでは、
 
まず、ファイルを操作する際、
:ファイル操作用の変数を用意する。
 
:ファイルを読み書きする前に、ファイルを開く必要がある。
:読み書きの作業が終わったら、安全のためファイルを閉じる。閉じられた状態のファイルは、そのままでは読み書きできない。
 
などの特徴がある。
 
 
 
また、ファイルを作成したりオープンした直後に、本当にその作業が成功したかどうかの確認のためのコードを入れるのが一般的である。
 
 
なぜなら、ファイル入出力の関数は、パソコンのハードディスクを書き換えるので、エラーが起きた際、大きな被害に発展しかねない。
 
 
なので、そのような誤作動にそなえて、ファイルのオープンなどが上手くいったかを確認する必要がある。
 
そして、もしファイルのオープンに失敗した場合、終了する処理をコードに書くのが一般的である。(上記のコードでは、<code> return 1 </code>で関数を終了させている。)
 
 
 
=== ファイルのオープンとクローズ ===
 
<code> CreateFile() </code> で作成されたファイルハンドルは、自動的に開かれる。
 
なので、目的のファイル処理が終わったら、
 
<code> CloseHandle() </code>でファイルハンドルを閉じる必要がある。
 
 
=== 関数の内容 ===
<source lang=c>
CreateFile(
TEXT("test.txt"), GENERIC_READ, 0, NULL,
CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL
);
</source>
 
とあるが、いくつもある引数の意味は、それぞれ
<source lang=c>
CreateFile(
操作対象のファイル名, アクセスモード , 共有モード, セキュリティ記述子,
作成方法, ファイル属性, テンプレートファイルのハンドル
);
</source>
を設定している。
 
正確な情報は、マイクロソフトmsdn [https://msdn.microsoft.com/ja-jp/library/cc429198.aspx] を参照せよ。
 
==== アクセスモード ====
読み取りモードでアクセスする場合には、
 
アクセスモードを
:<code>GENERIC_READ</code>
にする。
 
書き込みモードでアクセスする場合には、
 
アクセスモードを
:<code>GENERIC_WRITE</code>
にする。
 
==== 共有モードとは? ====
「共有モード」とは何かというと、上記のプログラムがファイルを開いている間、後続のアクセス命令がアクセスできるかどうかを指定することです。
 
共有モードを「0」にすると、ファイルハンドルを閉じてからでないと、ほかのプログラムがアクセスできません。
 
FILE_SHARE_READ に設定すると、ハンドルを閉じなくても、後続アクセスは読み込みだけ可能になります。
 
同様に、
FILE_SHARE_WRITE に設定すると、ハンドルを閉じなくても、後続アクセスは書き込みだけ可能になります。
 
==== セキュリティ記述子 ====
難しいので、説明を省略。詳しくは マイクロソフトmsdn [https://msdn.microsoft.com/ja-jp/library/cc429198.aspx] を参照せよ。
 
NULL にすれば、特に指定しないことになります。
 
 
==== 「作成方法」とは ====
名前こそ「作成方法」ですが(マイクロソフトMSDNがそう呼んでいる)、これは、ファイルが存在するとき(もしくは存在しないとき)、どう処理するかの指定です。
 
CREATE_NEW なら、
:対象のファイルと同名のファイルが存在すれば、この関数<code>CreateFile()</code>は失敗する。(何も作成しない。)
:対象のファイルと同名のファイルが存在すれば、この関数<code>CreateFile()</code>が実行される。(つまり、ファイルが作成される。)
という意味です。
 
他にも指定子はいろいろとありますが、すべて説明すると長くなってしまうので、詳しくは MSDN などを参考にしてください。
 
==== ファイル属性 ====
ファイルの属性を、「読み込み専用」とか、いろいろと設定できるのですが、初心者にはめんどくさいので、何も設定しないでおきましょう。
 
<code>FILE_ATTRIBUTE_NORMAL</code> を指定すれば、何も設定しないことになります。
 
==== テンプレートファイルのハンドル ====
難しいので説明を省略。
 
よく分からなければ、 NULL を指定しとけばいい。
 
詳しくは、 マイクロソフト MSDN を参照せよ。
 
 
23,093

回編集