1. #ifdef _WIN32
    2. #include <intrin.h>
    3. #else
    4. #include <dlfcn.h>
    5. #endif
    6. std::string GetModulePath() {
    7. std::string path;
    8. size_t index;
    9. #ifdef _WIN32
    10. char cpath[MAX_PATH] = {0};
    11. HMODULE hm = NULL;
    12. void* callerAddress = _ReturnAddress();
    13. GetModuleHandleExA(
    14. GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
    15. (LPCSTR)callerAddress, &hm);
    16. GetModuleFileNameA(hm, cpath, sizeof(cpath));
    17. if (cpath[2] == '?') {
    18. path = std::string(cpath + 4);
    19. } else {
    20. path = cpath;
    21. }
    22. index = path.find_last_of('\\');
    23. path.erase(index + 1);
    24. #else
    25. Dl_info dli;
    26. dladdr((void*)GetModulePath, &dli);
    27. path = dli.dli_fname;
    28. index = path.find_last_of('/');
    29. #endif
    30. path.erase(index + 1);
    31. return path;
    32. }