[CORE] Bug and formating fixes for GetApplicatonDir (#2285)
* Fix formating problems with GetApplicationDir. Don't ever return an empty string * always return a valid path even if it's ./ * remove the need for the dll and just use the normal GetModuleFileName function
This commit is contained in:
parent
f57727995a
commit
f4dea6919a
1 changed files with 61 additions and 88 deletions
63
src/rcore.c
63
src/rcore.c
|
@ -166,29 +166,13 @@
|
|||
#ifndef MAX_PATH
|
||||
#define MAX_PATH 1025
|
||||
#endif
|
||||
void *LoadLibraryA(void *lpLibFileName);
|
||||
void *LoadLibraryW(void *lpLibFileName);
|
||||
|
||||
#ifdef UNICODE
|
||||
#define LoadLibrary LoadLibraryW
|
||||
#else
|
||||
#define LoadLibrary LoadLibraryA
|
||||
#endif // !UNICODE
|
||||
|
||||
void *GetProcAddress(void *hModule, void *lpProcName);
|
||||
|
||||
void *GetCurrentProcess(void);
|
||||
bool FreeLibrary(void *hLibModule);
|
||||
|
||||
unsigned int GetModuleFileNameA( void* hModule, const char* lpFilename, unsigned int nSize);
|
||||
unsigned int GetModuleFileNameW( void* hModule, const unsigned short* lpFilename, unsigned int nSize);
|
||||
int WideCharToMultiByte(unsigned int cp, unsigned long flags, const unsigned short *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default);
|
||||
|
||||
const char pathDelim = '\\';
|
||||
#elif defined(__linux__)
|
||||
#include <unistd.h>
|
||||
const char pathDelim = '/';
|
||||
#elif defined(__APPLE__)
|
||||
#include <sys/syslimits.h>
|
||||
const char pathDelim = '/';
|
||||
#endif // OSs
|
||||
#endif // PLATFORM_DESKTOP
|
||||
|
||||
|
@ -3007,36 +2991,13 @@ const char *GetApplicationDirectory(void)
|
|||
memset(appDir, 0, MAX_FILEPATH_LENGTH);
|
||||
|
||||
#if defined(_WIN32)
|
||||
typedef unsigned long(*GetModuleFileNameFunc)(void*, void*, void*, unsigned long);
|
||||
|
||||
GetModuleFileNameFunc getModuleFileNameExWPtr = NULL;
|
||||
void *lib = LoadLibrary(L"psapi.dll");
|
||||
|
||||
if (lib == NULL)
|
||||
{
|
||||
appDir[0] = '\\';
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined (UNICODE)
|
||||
getModuleFileNameExWPtr = (GetModuleFileNameFunc)GetProcAddress(lib, "GetModuleFileNameExW");
|
||||
#else
|
||||
getModuleFileNameExWPtr = (GetModuleFileNameFunc)GetProcAddress(lib, "GetModuleFileNameExA");
|
||||
#endif
|
||||
|
||||
if (getModuleFileNameExWPtr == NULL)
|
||||
{
|
||||
appDir[0] = '\\';
|
||||
}
|
||||
else
|
||||
{
|
||||
int len = 0;
|
||||
#if defined (UNICODE)
|
||||
unsigned short widePath[MAX_PATH];
|
||||
len = getModuleFileNameExWPtr(GetCurrentProcess(), NULL, widePath, MAX_PATH);
|
||||
len = GetModuleFileNameW(NULL, widePath, MAX_PATH);
|
||||
len = WideCharToMultiByte(0, 0, widePath, len, appDir, MAX_PATH, NULL, NULL);
|
||||
#else
|
||||
len = getModuleFileNameExWPtr(GetCurrentProcess(), NULL, appDir, MAX_PATH);
|
||||
len = GetModuleFileNameA(NULL, appDir, MAX_PATH);
|
||||
#endif
|
||||
if (len > 0)
|
||||
{
|
||||
|
@ -3049,10 +3010,12 @@ const char *GetApplicationDirectory(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
appDir[0] = '.';
|
||||
appDir[1] = '\\';
|
||||
}
|
||||
|
||||
FreeLibrary(lib);
|
||||
}
|
||||
#elif defined(__linux__)
|
||||
unsigned int size = sizeof(appDir);
|
||||
ssize_t len = readlink("/proc/self/exe", appDir, size);
|
||||
|
@ -3068,6 +3031,11 @@ const char *GetApplicationDirectory(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
appDir[0] = '.';
|
||||
appDir[1] = '/';
|
||||
}
|
||||
#elif defined(__APPLE__)
|
||||
uint32_t size = sizeof(appDir);
|
||||
|
||||
|
@ -3083,6 +3051,11 @@ const char *GetApplicationDirectory(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
appDir[0] = '.';
|
||||
appDir[1] = '/';
|
||||
}
|
||||
#endif
|
||||
|
||||
return appDir;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue