指定したINIファイルからのデータ読み込み

[戻る]
入門者 2010/01/08(金) 15:16:21
昨日から、ソフトVC++を始めた初心者です。
会社にINIファイルを読み込める機能を追加しろと言われ調べながら
C:WINDOWSの中にあるINIファイルを読み込み表示できたのですが、
.exeと同じフォルダのINIファイルの表示がうまくできません。
お手数ですが、ご教示ください。



開発環境
VisualStudio2008、VC++、WindowsXP

=====================================
test1.cpp

BOOL CxxxApp::InitInstance()
{
    AfxEnableControlContainer();

//INIファイル読み込み先のPATH設定の開始//

        /*自プログラムのフルパス名を取得する*/
        char exeFullPath[512];
        ::GetModuleFileName(NULL,exeFullPath,MAX_PATH);
        char* pdest = strrchr(exeFullPath, 'g'); 
        pdest[1] = '\0';

        //文字列に変換
        exepath.Format("%s",exeFullPath);

        //領域の初期化
        free((void*)m_pszProfileName);

        //INIファイルのパスを設定
        m_pszProfileName=_tcsdup(exepath);

    int CEasyCommToolApp::ExitInstance() 
        {    
        return CWinApp::ExitInstance();
        }
}
=====================================
test2.cpp

//INIファイル読み込みボタン
void Cyyy::OnButton_INI() 
{    
    name = GetPrivateProfileInt( "test", "name", 999999, "xxx.ini" );
    
    SetDlgItemInt(IDC_EDIT2,name);

}

=====================================

入門者 2010/01/08(金) 15:19:18
char* pdest = strrchr(exeFullPath, 'g'); 

ではなく

char* pdest = strrchr(exeFullPath, '\\');
でした。
失礼しました。

Blue 2010/01/08(金) 15:34:53
参考
http://www.hiramine.com/programming/windows/inifilewriteget.html

maru 2010/01/08(金) 15:45:06
        ::GetModuleFileName(NULL,exeFullPath,MAX_PATH);
で取得したモジュールパスを分解して、iniファイルのフルパス名を作成して、
    name = GetPrivateProfileInt( "test", "name", 999999, "xxx.ini" );
のファイル名に渡すだけ。
pszProfileNameを書き換える必要はない。

入門者 2010/01/08(金) 16:01:49
Blue様、maru様
早速のご回答ありがとうございます。
URLと指摘された事項を参照し、試みてみます。

入門者 2010/01/08(金) 16:35:07
たびたび失礼します。
ご指摘いただいた事を参考にtest1.cppを下記のように書き換え、
「カーソル行の前まで実行」でiniPathNameにカーソルを合わせると
iniファイルまでのパスがちゃんと表示されるのですが、うまくいきません。

あと、
name = GetPrivateProfileInt( "test", "name", 999999, "xxx.ini" );
のファイル名に渡すだけ。
との事ですが渡すとはどのようにすればよいのでしょうか?

お手数ですが、ご教示ください。


=====================================
test1.cpp
/*自プログラムのフルパス名を取得する*/
 TCHAR exeFullPath[512];
 ::GetModuleFileName(NULL,exeFullPath,MAX_PATH);
    //char* pdest = strrchr(exeFullPath, '\\'); 
    //pdest[1] = '\0';
 TCHAR    iniPathName[_MAX_PATH];
 TCHAR    drive[_MAX_DRIVE];
 TCHAR    dir[_MAX_DIR];
 TCHAR    fname[_MAX_FNAME];
 TCHAR    ext[_MAX_EXT];
  _splitpath(exeFullPath,drive,dir,fname,ext);
  _tmakepath_s( iniPathName, _MAX_PATH, drive, dir, fname, _T("ini") );

    //文字列に変換
    //exepath.Format("%s",exeFullPath);

    //領域の初期化
    //free((void*)m_pszProfileName);

    //INIファイルのパスを設定
    //m_pszProfileName=_tcsdup(iniPathName);
=====================================
test2.cpp

//INIファイル読み込みボタン
void Ctest2::OnButton_INI() 
{    
    name = GetPrivateProfileInt( "test", "name", 999999, "xxx.ini" );
    
    SetDlgItemInt(IDC_EDIT2,name);

}

=====================================

maru 2010/01/08(金) 16:46:13
とりあえず、
  「GetPrivateProfileIntのヘルプを見ましたか?」
ヘルプをみれば、
> との事ですが渡すとはどのようにすればよいのでしょうか?
こんな質問出てこないはずです。

ここにも「ググるな危険」があるような。

入門者 2010/01/08(金) 17:53:56
[[解決]]
maru様

自分なりにはGetPrivateProfileInt関数を調べて理解したつもりでしたが、
lpFileName には、iniファイル名を指定すると思っていたのですが、
指摘され再度隅々まで閲覧したところファイル名だけでなく、
作成したフルパスも指定できるのですね。
理解が浅かったです。。失礼しました。

name = GetPrivateProfileInt( "test", "name", 999999, "xxx.ini" );
の"xxx.ini"をiniPathName にしたところ、無事解決しました。
ありがとうございました。

古いスレッドには追加発言できません。