struct PER_USER_PATH { LPWSTR wszFile; LPWSTR wszPerUserFile; LPSTR szFile; LPSTR szPerUserFile; DWORD cFileLen; // Length of the file name in symbols BOOL bInitANSIFailed; // Indicates that path name is not // translatable to ANSI BOOL bWildCardUsed; // TRUE if file name has * in it. LPSTR szPerUserDir; // Per-user directory for a file LPWSTR wszPerUserDir; // Per-user directory for a file DWORD cPerUserDirLen; PER_USER_PATH(): wszFile(NULL), wszPerUserDir(NULL), szFile(NULL), szPerUserDir(NULL), cFileLen(0), bInitANSIFailed(FALSE), bWildCardUsed(FALSE), wszPerUserFile(NULL), szPerUserFile(NULL), cPerUserDirLen(0) { } ~PER_USER_PATH() { if (wszFile) { LocalFree(wszFile); } if (wszPerUserDir) { LocalFree(wszPerUserDir); } if (szFile) { LocalFree(szFile); } if (szPerUserDir) { LocalFree(szPerUserDir); } if (szPerUserFile) { LocalFree(szPerUserFile); } if (wszPerUserFile) { LocalFree(wszPerUserFile); } } DWORD Init(IN HKEY hKey, IN DWORD dwIndex); LPCSTR PathForFileA(IN LPCSTR szInFile, IN DWORD dwInLen); LPCWSTR PathForFileW(IN LPCWSTR wszInFile, IN DWORD dwInLen); private: BOOL InitANSI(); }; class CPerUserPaths { private: PER_USER_PATH* m_pPaths; DWORD m_cPaths; public: CPerUserPaths(); ~CPerUserPaths(); BOOL Init(); LPCSTR GetPerUserPathA(IN LPCSTR lpFileName); LPCWSTR GetPerUserPathW(IN LPCWSTR lpFileName); private: BOOL IsAppCompatOn(); };