この記事では、C#からINIファイルの設定値を取得する方法についてご説明します。
【動画】C#からINIファイルの設定値を取得する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
INIファイルを参照・値の取得はGetPrivateProfileString関数を使います。
GetPrivateProfileString関数はINIファイルから文字列を読み取ることができるAPI関数です。
取得したい値に該当するセクション名とキー名を引数に指定することで、対応する値を取得しています。
フォーム上には、セクション名とキー名を入力するテキストボックスが用意されており、実行ボタンをクリックするとその値を取得してGetPrivateProfileString関数に渡して実行し、セクション名とキー名に該当する値を一番下に設置されたテキストボックスに出力しています。
マクロ作成の流れ
INIファイルとフォームの例
INIァイル
今回は下のINIファイルを用意しました。
フォーム
今回は下のフォームを用意しました。
セクション名とキー名、INIファイルのフルパスをそれぞれ入力して実行ボタンをクリックすると、セクション名とキー名に該当する値が一番下のテキストボックスに出力されます。
セクション名に「connVal」、キー名に「comVal」を指定しているので、一番下のテキストボックスに「vb1」の値が出力されています。
コードの例
using System; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace wfcs_0062 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } // INIファイルから情報を取得するGetPrivateProfileStringというAPI関数を呼び出すため、DllImport属性を使って「kernel32.dll」という名前の DLLをインポートする // DllImport属性とは、API関数を呼び出すことができるようにするための属性 // 関数がUnicode文字列を正しく処理できるよう、CharSetにUnicodeを指定する [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] // GetPrivateProfileString関数の宣言 private static extern int GetPrivateProfileString( string lpAppName, // セクション名用の引数 string lpKeyName, // キー名用の引数 string lpDefault, // 指定されたセクション名とキー名の組み合わせがINIファイル内に存在しない場合に返されるデフォルト値用の引数 StringBuilder lpReturnedString, // 読み取った値用の引数 int nSize, // returnValueのサイズ用の引数 string lpFileName); // INIファイルのフルパス用の引数 private void button1_Click(object sender, EventArgs e) { // セクション名を取得する string section = txb_secNM.Text; // キー名を取得する string key = txb_keyNM.Text; // INIファイルのフルパスを取得する string iniFilePath = txb_iniFilePath.Text; // StringBuilderクラスの新しいインスタンスを生成する(領域を255バイトに指定) StringBuilder result = new StringBuilder(255); // GetPrivateProfileString関数を実行してINIファイルから値を取得する GetPrivateProfileString(section, key, "", result, 255, iniFilePath); // 取得した値をテキストボックスに出力する txb_val.Text = result.ToString(); } } }
注目すべきコード①
最初に見て頂きたいのは4行目から10行目です。
// INIファイルから情報を取得するGetPrivateProfileStringというAPI関数を呼び出すため、DllImport属性を使って「kernel32.dll」という名前の DLLをインポートする // DllImport属性とは、API関数を呼び出すことができるようにするための属性 // 関数がUnicode文字列を正しく処理できるよう、CharSetにUnicodeを指定する [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
コードの説明
以上のコードは、DllImport属性を使って「kernel32.dll」という名前の DLLをインポートする処理のコードです。
今回INIファイルから情報を取得するのにGetPrivateProfileStringというAPI関数を使います。
GetPrivateProfileStringというAPI関数を使うには、「kernel32.dll」というdllファイルを読み込む必要があるため、DllImport属性を使って「kernel32.dll」という名前の DLLをインポートします。
注目すべきコード②
次に見て頂きたいのは21行目から27行目です。
private static extern int GetPrivateProfileString( string lpAppName, // セクション名用の引数 string lpKeyName, // キー名用の引数 string lpDefault, // 指定されたセクション名とキー名の組み合わせがINIファイル内に存在しない場合に返されるデフォルト値用の引数 StringBuilder lpReturnedString, // 読み取った値用の引数 int nSize, // returnValueのサイズ用の引数 string lpFileName); // INIファイルのフルパス用の引数
コードの説明
以上のコードは、INIファイルから文字列を読み取るGetPrivateProfileString関数の宣言のコードです。
GetPrivateProfileString関数はAPI関数であり、C#でGetPrivateProfileString関数を実行する場合は以上のように宣言する必要があります。
なおGetPrivateProfileString関数の各引数については次の通りです。
lpApplicationName
lpApplicationNameには、INIファイル内のセクション名を指定します。
lpKeyName
lpKeyNameには、キーの名前を指定します。
lpDefault
lpDefaultには、指定されたセクション名とキー名の組み合わせがINIファイル内に存在しない場合に返されるデフォルト値を指定します。
lpApplicationNameに存在しないセクション名、またはlpKeyNameに存在しないキー名を指定された場合、lpDefaultに指定した値が引数lpReturnedStringに返されます。
例えばlpApplicationNameに存在しないセクション名、またはlpKeyNameに存在しないキー名を指定された場合、lpDefaultに「abc」と指定していたら、引数lpReturnedStringに「abc」の文字列が返されます。
lpReturnedString
lpReturnedStringは、読み取った値を格納するためのバッファ(文字列変数)を指定します。
このlpReturnedStringにセクション名とキー名に該当する値が返されます。
ただし、GetPrivateProfileString関数が返すデータのサイズが実行時に異なる可能性があり、バッファオーバーフローの可能性もあるので、その対策としてバッファは事前に十分な大きさに設定しておく必要があるため、以下のとおり41行目で255文字のバッファをlpReturnedStringの引数に設定しています。
// StringBuilderクラスの新しいインスタンスを生成する(領域を255バイトに指定) StringBuilder result = new StringBuilder(255);
nSize
nSizeは、lpReturnedStringバッファのサイズ(文字数)を指定します。
以下のとおり41行目で255文字のバッファをlpReturnedStringの引数に設定しているので、その文字数をLen関数で取得してnSizeの引数に指定します。
// StringBuilderクラスの新しいインスタンスを生成する(領域を255バイトに指定) StringBuilder result = new StringBuilder(255);
lpFileName
lpFileNameには、INIファイルのフルパスを指定します。
注目すべきコード③
次に見て頂きたいのは32行目から38行目です。
// セクション名を取得する string section = txb_secNM.Text; // キー名を取得する string key = txb_keyNM.Text; // INIファイルのフルパスを取得する string iniFilePath = txb_iniFilePath.Text;
コードの説明
以上のコードは、シート上に入力されたセクション名とキー名、INIファイルのフルパスを取得するコードです。
注目すべきコード④
次に見て頂きたいのは41行目です。
// StringBuilderクラスの新しいインスタンスを生成する(領域を255バイトに指定) StringBuilder result = new StringBuilder(255);
コードの説明
以上のコードは、セクション名とキー名に該当する値を格納する変数resultに255文字のバッファを格納するコードです。
GetPrivateProfileString関数はセクション名とキー名に該当する値をlpReturnedStringの引数に返しますが、その返すデータのサイズが実行時に異なる可能性があり、バッファオーバーフローの可能性もあるので、その対策としてバッファは事前に十分な大きさに設定しておく必要があります。
そのため、255文字のバッファをlpReturnedStringの引数に設定するため、変数resultに255文字のバッファを格納しています。
注目すべきコード⑤
次に見て頂きたいのは44行目から49行目です。
'指定されたセクション名とキー名に対応する値をINIファイルから読み取る '読み取った情報はresultに格納されている length = GetPrivateProfileString(secNM, _ keyNM, _ "", _ result, _ 255, _ iniFilePath)
コードの説明
以上のコードは、GetPrivateProfileString関数を実行するコードです。
以上のコードで引数に指定している値は下のとおりです。
第1引数
第1引数はGetPrivateProfileString関数の「lpApplicationName」に渡る値を指定しています。
「lpApplicationName」にはINIファイル内のセクション名を指定するので、セクション名が格納されている変数secNMを指定しています。
第2引数
第2引数はGetPrivateProfileString関数の「lpKeyName」に渡る値を指定しています。
「lpKeyName」にはINIファイル内のキー名を指定するので、キー名が格納されている変数keyNMを指定しています。
第3引数
第3引数はGetPrivateProfileString関数の「lpDefault」に渡る値を指定しています。
「lpDefault」には指定されたセクション名とキー名の組み合わせがINIファイル内に存在しない場合に返されるデフォルト値を指定するので、今回はブランクを返して欲しいため「””」を指定しています。
第4引数
第4引数はGetPrivateProfileString関数の「lpReturnedString」に渡る値を指定しています。
「lpReturnedString」には読み取った値を格納するためのバッファ(文字列変数)を指定するので、バッファが格納された変数resultを指定しています。
第5引数
第5引数はGetPrivateProfileString関数の「nSize」に渡る値を指定しています。
「nSize」にはlpReturnedStringバッファのサイズ(文字数)を指定するので、255の値を指定しています。
第6引数
第6引数はGetPrivateProfileString関数の「lpFileName」に渡る値を指定しています。
「lpFileName」にはINIファイルのフルパスを指定するので、INIファイルのフルパスが格納されている変数iniFilePathを指定しています。
なお、GetPrivateProfileString関数の引数については、「注目すべきコード②」で詳しく説明しているのでそちらもご覧ください。
注目すべきコード⑥
次に見て頂きたいのは44行目です。
// 取得した値をテキストボックスに出力する txb_val.Text = result.ToString();
コードの説明
以上のコードは、INIファイルから取得した、セクション名とキー名に該当する値をシートのテキストボックスに出力している処理のコードです。
変数resultには、GetPrivateProfileString関数が取得したセクション名とキー名に該当する値が格納されています。
動作確認
「INIファイルとフォームの例」をご覧ください。
最後に
この記事では、C#からINIファイルの設定値を取得する方法についてご説明しました。
C#からINIファイルの設定値を取得するには、GetPrivateProfileStringというAPI関数を使います。
GetPrivateProfileStringというAPI関数を使うことでC#からINIファイルの設定値が取得することができるので、本記事を参考にして頂けたら幸いです。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。