//========= Copyright Valve Corporation ============// #include #include #if defined(_WIN32) #include #endif #if defined(POSIX) #include #endif SharedLibHandle SharedLib_Load( const char *pchPath, std::string *pErrStr ) { SharedLibHandle pHandle = nullptr; #if defined( _WIN32) // Convert char* to wchar_t* for Unicode Windows API int wchars_num = MultiByteToWideChar(CP_UTF8, 0, pchPath, -1, NULL, 0); wchar_t* wstr = new wchar_t[wchars_num]; MultiByteToWideChar(CP_UTF8, 0, pchPath, -1, wstr, wchars_num); pHandle = (SharedLibHandle)LoadLibraryExW(wstr, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); delete[] wstr; #elif defined(LINUXARM64) pHandle = (SharedLibHandle) dlopen( pchPath, RTLD_LOCAL|RTLD_DEEPBIND|RTLD_NOW ); #elif defined(POSIX) pHandle = (SharedLibHandle) dlopen( pchPath, RTLD_LOCAL|RTLD_NOW ); #endif if ( pHandle == nullptr && pErrStr ) { #if defined( _WIN32) // TODO: Consider using FormatMessage to get an error string for this error code *pErrStr = std::to_string( GetLastError() ); #elif defined(POSIX) char * pErr = dlerror(); if ( pErr ) { *pErrStr = std::string ( pErr ); } #endif } return pHandle; } void *SharedLib_GetFunction( SharedLibHandle lib, const char *pchFunctionName) { #if defined( _WIN32) return (void*)GetProcAddress( (HMODULE)lib, pchFunctionName ); #elif defined(POSIX) return dlsym( lib, pchFunctionName ); #endif } void SharedLib_Unload( SharedLibHandle lib ) { if ( !lib ) return; #if defined( _WIN32) FreeLibrary( (HMODULE)lib ); #elif defined(POSIX) dlclose( lib ); #endif }