The best way to do this is to get the folder from the application .EXE path. To do that, you need to use the Win32 API GetModuleFileName(). That API will return the complete pathname of the calling process' EXE. Unfortunately, it can return an 8.3 style filename and can mangle your directory names. I've included a Win95 safe short->long pathname conversion function ( Win95 doesn't support this ). Finally, once you have a nice looking path, you chop off the .EXE name path off with another funciton I've included GetPathOnlyFromPathname. CString MyPath = GetPathOnlyFromPathname(GetLongPathname(GetAppPathname())); where you have the following 3 utility functions: CString GetAppPathname(void); CString GetLongPathname(const CString & ShortPathname); CString GetPathOnlyFromPathname(const CString & PathName); // returns the full pathname of the application CString CVChatApp::GetAppPathname(void) { char szAppPath[2048]; GetModuleFileName(NULL, szAppPath, sizeof(szAppPath)); return (GetLongPathname(szAppPath)); } The GetModuleFileName call will return an 8.3 style pathname to the EXE. You may want to convert that into a long filename so the directory name doesn't get mangled: // convert a short DOS type 8.3 pathname to a Long Filename is the // version of Windows support the export of the "GetLongPathName" API ( Win95 doesn't ) CString GetLongPathname(const CString & ShortPathname) { CString FullPath; // Win95 doesn't have the GetLongPathName function, // so we need to check the dll to see if it exists to avoid // a fatal run-time error. // Also, note that the name of the function as specified in the DLL // is different than the called name, due to UNICODE macro preprocessors // AND, I think GetLongPathName is a pascal-style called function, so // have to add __stdcall (__cdecl is the default, which is buggy) HMODULE hm; hm = GetModuleHandle("kernel32.dll"); typedef unsigned long (__stdcall *PFI)(LPCTSTR lpszShortPath, LPTSTR lpszLongPath, DWORD cchBuffer); PFI pGetLongPathName; FARPROC pTemp; pTemp = GetProcAddress(hm, "GetLongPathNameA"); char strLongName[MAX_PATH]; strcpy(strLongName, ""); if (pTemp != NULL) { DWORD dw; pGetLongPathName = (PFI)pTemp; dw = (*pGetLongPathName)(ShortPathname, strLongName, MAX_PATH); } else { strcpy(strLongName, ShortPathname); } FullPath = strLongName; return FullPath; } and you'll need one other function: CString GetPathOnlyFromPathname(const CString & PathName