| #include <iostream> | |
| #include <string> | |
| #include <example.h> | |
| #include <example_exe.h> | |
| #include <stdio.h> | |
| #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<int (*)(int)>(sym); | |
| #endif | |
| if (f(456) != (123 + 456)) { | |
| std::cerr << "Incorrect return value from plugin!" << std::endl; | |
| return 1; | |
| } | |
| DynamicLoader::CloseLibrary(handle); | |
| return 0; | |
| } |