void setupSearchPaths() { #ifdef Q_OS_WIN // Make sure Windows doesn't load DLLs from the current working directory SetDllDirectoryA(""); SetSearchPathMode(BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE); #endif }
int WebEmberLinker::link(const char* prefix) { assert(!mModuleHandle); std::string libdir(prefix); #ifdef _WIN32 if(!libdir.empty()) { #if defined(_DEBUG) && defined(SEPARATE_BUILDS) //In msvc I prefer to separate release/debug builds to prevent mixing the runtime. //Set SEPARATE_BUILDS to enable this feature. libdir += "\\bin_d"; #else libdir += "\\bin"; #endif SetDllDirectoryA(libdir.c_str()); SetCurrentDirectoryA(libdir.c_str()); libdir += "\\"; } //normally the browsers are disabling verbose popup messages from the OS on errors, //but to get more info on what is the missing DLL when linking recursively, we need to enable this. UINT browserErrorMode = GetErrorMode(); SetErrorMode(0); #else if (!libdir.empty()) { libdir += "/lib/"; } #endif std::string libfile(libdir + sLibName); FBLOG_INFO("WebEmberLinker::runEmber", "Loading library: " << libfile); //Loads the specified module into the address space of the calling process. mModuleHandle = LoadLib(libfile.c_str()); if (mModuleHandle == NULL) { #ifndef _WIN32 FBLOG_ERROR("WebEmberLinker::runEmber", "dlerror: " << dlerror()); #endif FBLOG_ERROR("WebEmberLinker::runEmber", "Unable to load " << libfile); return 1; } //Retrieves the address of an exported function or variable from the specified DLL. pStartWebEmber = (funcTypeStart)GetFunction(mModuleHandle, sFuncNameStart); if (pStartWebEmber == NULL) { #ifndef _WIN32 FBLOG_ERROR("WebEmberLinker::runEmber", "dlerror: " << dlerror()); #endif FBLOG_ERROR("WebEmberLinker::runEmber", "Unable to load function " << sFuncNameStart << " in " << libfile); UnloadLib(mModuleHandle); return 2; } //same as above pQuitWebEmber = (funcTypeQuit)GetFunction(mModuleHandle, sFuncNameQuit); if (pQuitWebEmber == NULL) { #ifndef _WIN32 FBLOG_ERROR("WebEmberLinker::runEmber", "dlerror: " << dlerror()); #endif FBLOG_ERROR("WebEmberLinker::runEmber", "Unable to load function " << sFuncNameQuit << " in " << libfile); UnloadLib(mModuleHandle); return 3; } #ifdef _WIN32 //SetErrorMode of the process back to the original. SetErrorMode(browserErrorMode); #endif return 0; }
MStatus initializeMayaPlugin(MObject obj) { MStatus status; if (!Environment::getValue<MAX_PATH>(WGT_HOME, wgtHome)) { #ifdef _WIN32 GetModuleFileNameA(hApp, wgtHome, MAX_PATH); PathRemoveFileSpecA(wgtHome); Environment::setValue(WGT_HOME, wgtHome); #endif // _WIN32 #ifdef __APPLE__ Dl_info info; if (!dladdr(reinterpret_cast<void*>(setContext), &info)) { WGT_ERROR_MSG("Generic plugin manager: failed to get current module file name%s", "\n"); } strcpy(wgtHome, info.dli_fname); const char* dir = dirname(wgtHome); Environment::setValue(WGT_HOME, dir); std::string dlybs = dir; dlybs += "/../PlugIns"; Environment::setValue("LD_LIBRARY_PATH", dlybs.c_str()); #endif // __APPLE__ } Environment::setValue("QTWEBENGINEPROCESS_PATH", wgtHome); #ifdef __APPLE__ Environment::setValue("QT_QPA_PLATFORM_PLUGIN_PATH", (std::string(wgtHome) + "/../PlugIns/platforms").c_str()); #else Environment::setValue("QT_QPA_PLATFORM_PLUGIN_PATH", (std::string(wgtHome) + "/platforms").c_str()); #endif #ifdef _WIN32 size_t convertedChars = 0; mbstowcs_s(&convertedChars, exePath, MAX_PATH, wgtHome, _TRUNCATE); assert(convertedChars); #endif // _WIN32 #ifdef __APPLE__ std::wstring_convert<std::codecvt_utf8<wchar_t>> conv; wcscpy(exePath, conv.from_bytes(wgtHome).c_str()); #endif // __APPLE__ QDir::setCurrent(wgtHome); char path[2048]; if (Environment::getValue<2048>(WGT_PATH, path)) { std::string newPath("\""); newPath += wgtHome; newPath += "\";"; newPath += path; Environment::setValue(WGT_PATH, newPath.c_str()); } #ifdef _WIN32 SetDllDirectoryA(wgtHome); #endif // _WIN32 pluginManager = new GenericPluginManager(); WGTShowCommand::registerCommand(obj); WGTHideCommand::registerCommand(obj); WGTStartCommand::registerCommand(obj); WGTStopCommand::registerCommand(obj); return loadWGT() ? MStatus::kSuccess : MStatus::kFailure; }
void Init( void ) { #ifdef _WIN32 char * common; std::string apple; HMODULE objc; HMODULE foundation; if( InterlockedCompareExchange( reinterpret_cast< volatile LONG * >( &inited ), 1, 0 ) != 0 ) { return; } #ifdef _WIN64 common = nullptr; #else common = getenv( "COMMONPROGRAMFILES(x86)" ); #endif if( common == nullptr ) { common = getenv( "COMMONPROGRAMFILES" ); } apple = std::string( common ) + "\\Apple\\Apple Application Support"; SetDllDirectoryA( apple.c_str() ); objc = LoadLibraryA( ( apple + "\\objc.dll" ).c_str() ); foundation = LoadLibraryA( ( apple + "\\Foundation.dll" ).c_str() ); if( objc == nullptr || foundation == nullptr ) { return; } Internal::objc_getClass = ( Class ( * )( const char * ) )GetProcAddress( objc, "objc_getClass" ); Internal::objc_getMetaClass = ( Class ( * )( const char * ) )GetProcAddress( objc, "objc_getMetaClass" ); Internal::objc_getProtocol = ( Protocol * ( * )( const char * ) )GetProcAddress( objc, "objc_getProtocol" ); Internal::objc_msgSend = ( id ( * )( id, SEL, ... ) )GetProcAddress( objc, "objc_msgSend" ); Internal::objc_msgSend_fpret = ( double ( * )( id, SEL, ... ) )GetProcAddress( objc, "objc_msgSend_fpret" ); Internal::objc_msgSend_stret = ( void ( * )( void *, id, SEL, ... ) )GetProcAddress( objc, "objc_msgSend_stret" ); Internal::objc_msgSendSuper = ( id ( * )( struct objc_super *, SEL, ... ) )GetProcAddress( objc, "objc_msgSendSuper" ); Internal::objc_allocateClassPair = ( Class ( * )( Class, const char *, size_t ) )GetProcAddress( objc, "objc_allocateClassPair" ); Internal::objc_registerClassPair = ( void ( * )( Class ) )GetProcAddress( objc, "objc_registerClassPair" ); Internal::sel_registerName = ( SEL ( * )( const char * ) )GetProcAddress( objc, "sel_registerName" ); Internal::sel_getName = ( const char * ( * )( SEL ) )GetProcAddress( objc, "sel_getName" ); Internal::object_getClass = ( Class ( * )( id ) )GetProcAddress( objc, "object_getClass" ); Internal::method_getImplementation = ( IMP ( * )( Method ) )GetProcAddress( objc, "method_getImplementation" ); Internal::method_getName = ( SEL ( * )( Method ) )GetProcAddress( objc, "method_getName" ); Internal::class_getSuperclass = ( Class ( * )( Class ) )GetProcAddress( objc, "class_getSuperclass" ); Internal::class_getName = ( const char * ( * )( Class ) )GetProcAddress( objc, "class_getName" ); Internal::class_copyMethodList = ( Method * ( * )( Class, unsigned int * ) )GetProcAddress( objc, "class_copyMethodList" ); Internal::class_addIvar = ( bool ( * )( Class, const char *, size_t, uint8_t, const char * ) )GetProcAddress( objc, "class_addIvar" ); Internal::class_addMethod = ( bool ( * )( Class, SEL, IMP, const char * ) )GetProcAddress( objc, "class_addMethod" ); Internal::class_addProtocol = ( bool ( * )( Class, Protocol * ) )GetProcAddress( objc, "class_addProtocol" ); Internal::class_getInstanceVariable = ( Ivar ( * )( Class, const char * ) )GetProcAddress( objc, "class_getInstanceVariable" ); Internal::ivar_getOffset = ( ptrdiff_t ( * )( Ivar ) )GetProcAddress( objc, "ivar_getOffset" ); Internal::NSLogv = ( void ( * )( id, va_list ) )GetProcAddress( foundation, "NSLogv" ); #else if( OSAtomicCompareAndSwap32( 0, 1, &inited ) == false ) { return; } Internal::objc_getClass = ::objc_getClass; Internal::objc_getMetaClass = ::objc_getMetaClass; Internal::objc_getProtocol = ::objc_getProtocol; Internal::objc_msgSend = ::objc_msgSend; Internal::objc_msgSend_fpret = ::objc_msgSend_fpret; Internal::objc_msgSend_stret = ::objc_msgSend_stret; Internal::objc_msgSendSuper = ::objc_msgSendSuper; Internal::objc_allocateClassPair = ::objc_allocateClassPair; Internal::objc_registerClassPair = ::objc_registerClassPair; Internal::sel_registerName = ::sel_registerName; Internal::sel_getName = ::sel_getName; Internal::object_getClass = ::object_getClass; Internal::method_getImplementation = ::method_getImplementation; Internal::method_getName = ::method_getName; Internal::class_getSuperclass = ::class_getSuperclass; Internal::class_getName = ::class_getName; Internal::class_copyMethodList = ::class_copyMethodList; Internal::class_addIvar = ::class_addIvar; Internal::class_addMethod = ::class_addMethod; Internal::class_addProtocol = ::class_addProtocol; Internal::class_getInstanceVariable = ::class_getInstanceVariable; Internal::ivar_getOffset = ::ivar_getOffset; Internal::NSLogv = ::NSLogv; #endif }
static void setup_python(int argc, char **argv) { char *pathlist = NULL; TCHAR szPath[MAX_PATH]; std::string module_path; if (GetModuleFileName(NULL, szPath, MAX_PATH)) { CHAR char_path[MAX_PATH] = {0}; WideCharToMultiByte(CP_UTF8, 0, szPath, -1, char_path, MAX_PATH, NULL, NULL); std::string full_path(char_path); size_t path_end = full_path.find_last_of('\\'); if (path_end != std::string::npos) module_path = full_path.substr(0, path_end + 1); } #if 0 if (_dupenv_s(&pathlist, &bufsize, "PYTHONPATH") == 0 && pathlist) { int len = strlen("PYTHONPATH")+1+strlen(pathlist)+strlen(";python;scripts")+1; char *tmp = (char*)malloc(len); sprintf_s(tmp, len, "PYTHONPATH=%s;python;scripts", pathlist); _putenv(tmp); free(tmp); } else #endif SetDllDirectoryA((module_path + "..").c_str()); // This should initialize PYTHONPATH, but for some reason it doesn't work when built in VS2010. std::string pythonpath; pythonpath.append(module_path).append("modules;"); pythonpath.append(module_path).append("python;"); pythonpath.append(module_path).append("python\\Lib;"); pythonpath.append(module_path).append("python\\libs;"); pythonpath.append(module_path).append("python\\DLLs;"); _putenv_s("PYTHONHOME", "python"); _putenv_s("PYTHONPATH", pythonpath.c_str()); if (pathlist) free(pathlist); Py_SetProgramName(argv[0]); // Here comes some ugly hack to fix PYTHONPATH init problem. // Create dummy site package to avoid error import site message from Py_Initialize(); FILE *pFile; pFile = fopen("site.py", "w"); if (pFile != NULL) fclose(pFile); Py_Initialize(); // Delete dummy site module. remove("site.py"); remove("site.pyc"); PySys_SetArgv(argc, argv); // Now import sys and modify PYTHONPATH. PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('modules')"); PyRun_SimpleString("sys.path.append('python')"); PyRun_SimpleString("sys.path.append('python\\Lib')"); PyRun_SimpleString("sys.path.append('python\\libs')"); PyRun_SimpleString("sys.path.append('python\\DLLs')"); // Reload site module with real module from updated PYTHONPATH. PyRun_SimpleString("import site"); PyRun_SimpleString("reload(site)"); }