[MFC] Cum gasesc folderul aplicatiei?

Despre MFC, ATL si alte biblioteci C++ de la Microsoft (forum moderat)
Post Reply
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

[MFC] Cum gasesc folderul aplicatiei?

Post by Ovidiu Cucu » 05 Aug 2007, 18:38

Problema
Se intampla ca o aplicatie sa failizeze atunci cand cauta un fisier in folder-ul ei sau intr-un sub-folder desi acel fisier este bine-mersi acolo. Cele mai posibile cauze sunt doua: sau programatorul a folosit numai numele fisierului, sau a folosit un full-path-and-file-name batut in cod (ex: "c:\Program Files\MyCoolApp\MyLog.txt"). In primul caz se va folosi directorul curent al aplicatiei dar acesta nu este neaparat acelasi cu folderul aplicatiei (directorul curent poate fi diferit inca de la lansarea aplicatiei sau poate fi schimbat la run-time). In al doilea caz, aplicatia insasi poate fi instalata in alt folder (in exemplul nostru "c:\Program Files\..." sau chiar foldere speciale cum sunt "Program Files" pot avea denumiri diferite in functie de versiunea de OS, limba, etc).

Rezolvare (1)
Una dintre solutii ar fi sa "extragem" folderul applicatiei din membrul public m_pszHelpFilePath al clasei aplicatiei (derivata din CWinApp).

Code: Select all

bool CWhateverClass::GetAppPath(CString& strAppPath)
{
   bool bFound = false;
   strAppPath.Empty();
   CWinApp* pApp = AfxGetApp();
   if(NULL != pApp)
   {
      strAppPath = pApp->m_pszHelpFilePath;
      // extract the application path
      const int nPos = strAppPath.ReverseFind(_T('\'));
      if(-1 != nPos)
      {
         bFound = true;
         strAppPath = strAppPath.Left(nPos);
      }
   }
   return bFound;
}
Rezolvare (2)
Prima metoda ar fi destul de buna, dar mai sigur si chiar mai simplu este sa folsim functia WinAPI GetModuleFileName careia ii pasam NULL in primul parametru.

Code: Select all

void CWhateverClass::GetAppPath(CString& strAppPath)
{
   ::GetModuleFileName(NULL, strAppPath.GetBuffer(MAX_PATH), MAX_PATH);
   strAppPath.ReleaseBuffer();
   // extract the application path
   const int nPos = strAppPath.ReverseFind(_T('\'));
   strAppPath = strAppPath.Left(nPos);
}

<< Back to MFC index



Post Reply