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