#include #include #include #include #include #include "DynamicLoader.hxx" // Implement the ABI used by plugins. extern "C" int example_exe_function() { std::cout << "hello" << std::endl; return 123; } #ifdef CMAKE_INTDIR # define CONFIG_DIR "/" CMAKE_INTDIR #else # define CONFIG_DIR "" #endif int main() { std::string const libName = EXAMPLE_EXE_PLUGIN_DIR CONFIG_DIR "/" EXAMPLE_EXE_MOD_PREFIX "example_mod_1" EXAMPLE_EXE_MOD_SUFFIX; DynamicLoader::LibraryHandle handle = DynamicLoader::OpenLibrary(libName); if (!handle) { // Leave the .c_str() on this one. It is needed on OpenWatcom. std::cerr << "Could not open plugin \"" << libName.c_str() << "\"!" << std::endl; return 1; } DynamicLoader::SymbolPointer sym = DynamicLoader::GetSymbolAddress(handle, "example_mod_1_function"); if (!sym) { std::cerr << "Could not get plugin symbol \"example_mod_1_function\"!" << std::endl; return 1; } #ifdef __WATCOMC__ int(__cdecl * f)(int) = (int(__cdecl*)(int))(sym); #else int (*f)(int) = reinterpret_cast(sym); #endif if (f(456) != (123 + 456)) { std::cerr << "Incorrect return value from plugin!" << std::endl; return 1; } DynamicLoader::CloseLibrary(handle); return 0; }