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; } |