123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- #include <kwsys/DynamicLoader.hxx>
- #include <example.h>
- #include <example_exe.h>
- #include <iostream>
- #include <string>
- #include <stdio.h>
- // 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 libName = EXAMPLE_EXE_PLUGIN_DIR CONFIG_DIR "/";
- libName += kwsys::DynamicLoader::LibPrefix();
- libName += "example_mod_1";
- libName += kwsys::DynamicLoader::LibExtension();
- kwsys::DynamicLoader::LibraryHandle handle =
- kwsys::DynamicLoader::OpenLibrary(libName.c_str());
- 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;
- }
- kwsys::DynamicLoader::SymbolPointer sym =
- kwsys::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;
- }
- kwsys::DynamicLoader::CloseLibrary(handle);
- return 0;
- }
|