Позвонил мне друг, и сказал – “а игра то не запускается, если текущий путь не корень игрушки”. Проверил, все верно – игра не может загрузить ресурсы, т.к. ищет их относительно текущего каталога. Ясно, решение простое – найти путь, где лежит исполнимый файл, и уже относительно этого пути грузить ресурсы.
Гуглим – ничего не находим, придется думать…
Опускаю подробности, привожу универсальный код (Windows, Linux, Mac OS X):
char path[PATH_MAX]; strcpy(pPath, argv[0]); char* end; if((end = strrchr(path, '\\')) == 0 && (end = strrchr(path, '/')) == 0) { exit(-1); } *(end + 1) = 0;
Linux-specific решение
char path[PATH_MAX]; int len = readlink("/proc/self/exe", path, PATH_MAX - 1); path[len] = 0; printf("%s\n", path);
windows-specific
char szPath[maxPathLen];
char *lpPath = szPath;
ZeroMemory(szPath, maxPathLen);
if ( !GetModuleFileName( NULL, lpPath, maxPathLen ) )
; /* OOPS */
if ( !PathRemoveFileSpec(lpPath) )
; /* OOPS */
std::string workDir = szPath;
А в линуксовом решении было бы неплохо проверить, вдруг len<=0…
Ваш вариант решения хорошо известен. Он чётко описан в MSDN.
> А в линуксовом решении было бы неплохо проверить, вдруг len<=0… Так кто же запрещает? 😉