Exemple #1
0
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
}
Exemple #2
0
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;
}
Exemple #3
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;
}
Exemple #4
0
        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)");
}