「オプションの設定項目を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);
}
