栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何从共享库调用函数?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何从共享库调用函数?

注意: 您正在库调用周围传递C 对象(在这种情况下为STL字符串)。有 **没有标准的C
ABI
在这个水平**,所以无论是尽量避免将C
++对象周围,或确保两个资料库和程序已建成具有相同的编译器(最好在同一台机器上相同的编译器,以避免任何微妙与配置相关的惊喜。)

不要忘记在库代码中 声明导出的方法

extern "C"

上面已经说过了,这是 一些代码,实现您要实现的目标

typedef std::string (*foo_t)(const std::string);foo_t foo = NULL;...# ifdef _WIN32  HMODULE hDLL = ::LoadLibrary(szMyLib);  if (!hDll) {  }  foo = (foo_t)::GetProcAddress(hDLL, "foo");# else  void *pLib = ::dlopen(szMyLib, RTLD_LAZY);  if (!pLib) {  }  foo = (foo_t)::dlsym(pLib, "foo");# endif  if (!foo) {  }  ...  foo("bar");  ...# ifdef _WIN32  ::FreeLibrary(hDLL);# else  ::dlclose(pLib);# endif

您可以 进一步抽象

#ifdef _WIN32#include <windows.h>typedef HANDLE my_lib_t;#else#include <dlfcn.h>typedef void* my_lib_t;#endifmy_lib_t MyLoadLib(const char* szMyLib) {# ifdef _WIN32  return ::LoadLibraryA(szMyLib);# else //_WIN32  return ::dlopen(szMyLib, RTLD_LAZY);# endif //_WIN32}void MyUnloadLib(my_lib_t hMyLib) {# ifdef _WIN32  return ::FreeLibrary(hMyLib);# else //_WIN32  return ::dlclose(hMyLib);# endif //_WIN32}void* MyLoadProc(my_lib_t hMyLib, const char* szMyProc) {# ifdef _WIN32  return ::GetProcAddress(hMyLib, szMyProc);# else //_WIN32  return ::dlsym(hMyLib, szMyProc);# endif //_WIN32}typedef std::string (*foo_t)(const std::string);typedef int (*bar_t)(int);my_lib_t hMyLib = NULL;foo_t foo = NULL;bar_t bar = NULL;...  if (!(hMyLib = ::MyLoadLib(szMyLib)) {  }  if (!(foo = (foo_t)::MyLoadProc(hMyLib, "foo")) {  }  if (!(bar = (bar_t)::MyLoadProc(hMyLib, "bar")) {  }  ...  foo("bar");  bar(7);  ...  ::MyUnloadLib(hMyLib);


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/412329.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号