RicH and FamouS

       Home         Glosar IT                                                                                                                                                                                                              SUBSCRIBE NOW!
        

26.04.2009

MFC Tips - Application

Cum gasim folder-ul aplicatiei?
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):

Cod:
bool CFoo::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:

Cod:
void 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);
}


Cum customizez AfxMessageBox?
Rezolvare:
AfxMessageBox cheama intern functia virtuala CWinApp::DoMessageBox. Exemplul urmator suprascrie CWinApp::DoMessageBox si schimba textul de pe caption (default, numele aplicatiei sau fisierului executabil)

Exemplu:

Cod:
// MyApp.h

class CMyApp : public CWinApp
{
// ...
// Overrides
public:
virtual int DoMessageBox(LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt);
// ...
};

// MyApp.cpp

int CMyApp::DoMessageBox(LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt)
{
// keep in mind m_pszAppName pointer
LPCTSTR pszAppName = m_pszAppName;
// assign the new desired name
m_pszAppName = _T("My Cool Message Box");
// call base class function
int nRet = CWinApp::DoMessageBox(lpszPrompt, nType, nIDPrompt);
// restore initial m_pszAppName pointer then return
m_pszAppName = pszAppName;
return nRet;
}

    Blog din Moldova    FastCounter 

 
Copyright © 2008-2010 Foster1. All rights reserved.