INIファイルを作成するには?

解決


ヨシ  2006-09-12 00:26:04  No: 62986

先週に引き続き質問です。
宜しくお願いいたします。

現在、自作のアプリケーションソフトを作成しているのですが、わからないところがあるので質問させてください。

作成しているアプリにはeditコントロールやコンボボックスなどたくさん入っているので、アプリ立ち上げ時に前回の終了時の設定をダイアログに入れるために、INIファイルを使いたいと思います。

そこで
http://www.ne.jp/asahi/hishidama/home/tech/vcpp/ini.html
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_INI.html
↑のホームページを参考に作成してみたのですが、初心者ゆえに書かれていることが難しく、Windowsディレクトリ配下にもファイルができませんでした。。
(HPの作者の方すいません。)

何かアドバイスしていただけませんでしょうか?

具体的な質問でなくて申し訳ありませんが宜しくお願いいたしますm(__)m


Blue  2006-09-12 00:29:32  No: 62987

とりあえず、OS,VCのバージョンとプロジェクトの種類を明記してくれますか?
上記のサイトはすべてMFC用です。

例)Windows XP Pro SP/Visual C++6.0/MFC Application


ヨシ  2006-09-12 01:05:06  No: 62988

Blueさん
前回に引き続きありがとうございます。

Windows XP Professional Version 2002 Service Pack2
Microsoft Visual Studio .NET 2003
MFC Application

です。
宜しくお願いします。


Blue  2006-09-12 01:20:27  No: 62989

どうも上記のサイトのように変更して、WriteProfileString等で書き込むと、
INIファイルではなくレジストリに書き込むようです。

キーは
HKEY_CURRENT_USER\Software\Local AppWizard-Generated Applications
らへん。

ですので、
  // 設定が保存される下のレジストリ キーを変更します。
  // TODO: この文字列を、会社名または所属など適切なものに
  // 変更してください。
  SetRegistryKey(_T("Local AppWizard-Generated Applications"));

の SetRegistryKey の記述をコメントアウトすればよさそう。


Blue  2006-09-12 01:29:57  No: 62990

追記

CWinAppクラスのm_pszProfileNameメンバ変数は _tcsdup で取得した領域ですので、
deleteではなく free を使うべきでしょう。(newではなくmallocもしくは_tcsdupを使う)
デストラクタで free も呼んでいるので、ExitInstanceで明にfreeする必要もないようです。

こちら
http://www.hiramine.com/programming/windows/inifilewriteget.html
のコードがベストでしょう。


ヨシ  2006-09-12 01:51:38  No: 62991

WINDOWSディレクトリ配下にINIファイルを作成することができました!
ありがとうございます。

で、今先ほどのHP↓
http://www.ne.jp/asahi/hishidama/home/tech/vcpp/ini.html

で、同一フォルダに作成するやりかたがわからずに苦戦しています。。

書いてある通りにコピペで作っていったのですが、m_pszProfileNameのデストラクタの追加の仕方がわかりません。。
これが原因なのでしょうか?
デストラクタなんて壊すだけのものだから処理には関係ないのかと思っているんですが。。

もう少し見直してみますが、今時点で方向が違っているのであれば、何かアドバイスください。

宜しくお願いします。


ヨシ  2006-09-12 01:53:26  No: 62992

すいません、BLUEさんからの16:29:57のコメントを確認せずにコメントしてしまいました。。

追記の部分も今から確認します!!


Blue  2006-09-12 01:58:33  No: 62993

>m_pszProfileNameのデストラクタの追加の仕方がわかりません。。
普通にコンストラクタの下にでも(Test.h)
>  ~CTestApp();
と記述して、
Test.cppのコンストラクタの下に
>CTestApp::~CTestApp()
>{
>  delete[] m_pProfileName;
>}
と記述すれば出来ると思いますが。

ただ、
1個前のレスにも書きましたが、
http://www.hiramine.com/programming/windows/inifilewriteget.html
をベースに書き直したほうがよいです。

http://www.ne.jp/asahi/hishidama/home/tech/vcpp/ini.html
はm_pszProfileNameの最初の領域をfreeしてませんし、使い終わったあとに、CWinAppクラスによって再度 freeが呼ばれると思います。(いろいろと問題あり)


ヨシ  2006-09-12 03:11:35  No: 62994

了解しました。
紹介していただいたHPを参考にしてみます。

申し訳ありませんが、今日は別件が入ったのでまた明日確かめて連絡します!


ヨシ  2006-09-12 22:53:57  No: 62995

返信遅れてすいません。
教えていただいたHPをもとにプログラムを修正して、
exeファイルと同階層にINIファイルを作成できました!

次に、書き込みまではできたので、読み込みを行いました。
GETProfileInt()を用いて、読み込みの処理も無事行えているようです。
(TextOut()で確認しました。)

ここで、新たな疑問点が出てきたので質問です。
INIファイルから読み込んだデータをエディットコントロールや
コンボボックスに設定したいのですが、できません。。
SetWindowText()を使おうとしたのですが、変数を追加するときに、
カテゴリを「CONTROL」ではなく「VALUE」、変数の種類を「int」や「float」にしたのが原因のようです。

SetWindowText()以外に「VALUE」の値をセットする関数があるのでしょうか?
それとも、別の方法があるのでしょうか??

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


Blue  2006-09-12 22:59:33  No: 62996

表題と別の質問であるならば、今度から新しいスレッドをたててくださいね。

>カテゴリを「CONTROL」ではなく「VALUE」、変数の種類を「int」や「float」にしたのが原因のようです。
ダイアログ変数(でいいのかな?)があるならば、その変数に値を入れて、

UpdateData( FALSE );

を呼べば更新されます。
また、コントロールIDを使って、SetDlgItemTextやSetDlgItemIntを使うことも出来ます。
もちろんSetWindowTextで数値を文字列として変換していれることも可能です。


ヨシ  2006-09-13 00:03:27  No: 62997

解決できました。

ありがとうございます。

アドバイスもありがとうございました。

今後とも宜しくお願いします!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加