|
150 | 150 | #include "pfPython/cyMisc.h"
|
151 | 151 | #include "pfPython/cyPythonInterface.h"
|
152 | 152 |
|
| 153 | +#ifdef HS_BUILD_FOR_UNIX |
| 154 | +# include <dlfcn.h> // For ModDLL loading |
| 155 | +#endif |
153 | 156 |
|
154 | 157 | #define MSG_LOADING_BAR
|
155 | 158 |
|
@@ -365,6 +368,58 @@ bool plClient::Shutdown()
|
365 | 368 | return false;
|
366 | 369 | }
|
367 | 370 |
|
| 371 | +void plClient::InitDLLs() { |
| 372 | + hsStatusMessage("Init dlls client\n"); |
| 373 | + |
| 374 | + std::vector<plFileName> dlls = plFileSystem::ListDir("ModDLL", |
| 375 | +#if defined(HS_BUILD_FOR_WIN32) |
| 376 | + "*.dll" |
| 377 | +#elif defined(HS_BUILD_FOR_APPLE) |
| 378 | + "*.dylib" |
| 379 | +#else |
| 380 | + "*.so" |
| 381 | +#endif |
| 382 | + ); |
| 383 | + |
| 384 | + for (auto iter = dlls.begin(); iter != dlls.end(); ++iter) |
| 385 | + { |
| 386 | +#ifdef HS_BUILD_FOR_WIN32 |
| 387 | + hsLibraryHndl mod = LoadLibraryW(iter->WideString().data()); |
| 388 | +#else |
| 389 | + hsLibraryHndl mod = dlopen(iter->AsString().c_str(), RTLD_LAZY | RTLD_LOCAL); |
| 390 | +#endif |
| 391 | + |
| 392 | + if (mod) |
| 393 | + { |
| 394 | +#ifdef HS_BUILD_FOR_WIN32 |
| 395 | + pInitGlobalsFunc initGlobals = (pInitGlobalsFunc)GetProcAddress(mod, "InitGlobals"); |
| 396 | +#else |
| 397 | + pInitGlobalsFunc initGlobals = (pInitGlobalsFunc)dlsym(mod, "InitGlobals"); |
| 398 | +#endif |
| 399 | + |
| 400 | + (*initGlobals)(hsgResMgr::ResMgr(), plFactory::GetTheFactory(), plgTimerCallbackMgr::Mgr(), |
| 401 | + hsTimer::GetTheTimer(), plNetClientApp::GetInstance()); |
| 402 | + fLoadedDLLs.emplace_back(mod); |
| 403 | + } |
| 404 | + } |
| 405 | +} |
| 406 | + |
| 407 | +void plClient::ShutdownDLLs() |
| 408 | +{ |
| 409 | + for (hsLibraryHndl mod : fLoadedDLLs) |
| 410 | + { |
| 411 | +#ifdef HS_BUILD_FOR_WIN32 |
| 412 | + BOOL ret = FreeLibrary(mod); |
| 413 | + if (!ret) |
| 414 | + hsStatusMessage("Failed to free lib\n"); |
| 415 | +#else |
| 416 | + dlclose(mod); |
| 417 | +#endif |
| 418 | + } |
| 419 | + |
| 420 | + fLoadedDLLs.clear(); |
| 421 | +} |
| 422 | + |
368 | 423 | void plClient::InitAuxInits()
|
369 | 424 | {
|
370 | 425 | // Use another init directory specified in Command line Arg -i
|
|
0 commit comments