「オプションの設定項目をiniファイルとして実行ファイルの存在するフォルダ内に保存したい」というようなときに使えるのがGetModuleFileName関数。この関数では実行ファイルへのフルパスを取得できる。しかし必要なのはフォルダ名の部分までだ。ここではフォルダ名までを取得できる関数を用意した。
依存環境:ATL#include "atlstr.h" // // 実行ファイルの存在するフォルダとファイル名を取得する // //実行ファイルが"c:\test\aaa.exe"の場合は、pstrFolderに"c:\test\"、pstrFileに"aaa.exe"が帰る //pstrFolderの末尾は'\'になる // bool GetExecDir(CAtlString* pstrFolder,CAtlString* pstrFile) { int nLen; errno_t err; TCHAR pcbPath[_MAX_PATH*2]; //あまり意味はないが2倍値を利用 TCHAR pszDrive[_MAX_DRIVE]; TCHAR pszFolder[_MAX_DIR]; TCHAR pszFile[_MAX_FNAME]; TCHAR pszExtent[_MAX_EXT ]; if(pstrFolder == NULL && pstrFile == NULL) return true; if(pstrFolder) *pstrFolder = _T(""); if(pstrFile) *pstrFile = _T(""); //起動ディレクトリ名、ファイル名取得 nLen = ::GetModuleFileName(NULL,pcbPath,_MAX_PATH*2); if(nLen == 0) return false; //パスの分解 err = ::_tsplitpath_s(pcbPath,pszDrive,_MAX_DRIVE,pszFolder,_MAX_DIR,pszFile,_MAX_FNAME,pszExtent,_MAX_EXT); if(err != 0) return false; //結果保存 if(pstrFolder) { *pstrFolder = pszDrive; *pstrFolder += pszFolder; } if(pstrFile) { *pstrFile = pszFile; *pstrFile += pszExtent; } return true; } void Test(void) { CAtlString strMessage; CAtlString strFolder; CAtlString strExec; GetExecDir(&strFolder,&strExec); strMessage.Format(_T("フォルダは「%s」、ファイル名は「%s」です"),strFolder,strExec); ::MessageBox(NULL,strMessage,_T(""),MB_OK); }