21xrx.com
2024-11-05 21:34:55 Tuesday
登录
文章检索 我的文章 写文章
C++加载动态库的三种方法
2023-06-22 02:01:31 深夜i     --     --
dlopen LoadLibrary ctypes

C++是一种广泛使用的编程语言。在C++程序中,如果想要使用动态库,就需要将其加载到程序中。本文将介绍C++加载动态库的三种方法。

方法一:LoadLibrary

LoadLibrary方法是Windows系统下的一种动态库加载方式。该方法的函数原型为:

HMODULE LoadLibrary(LPCTSTR lpFileName);

其中,lpFileName是要加载的动态库文件名。函数返回值是一个HMODULE类型的句柄,如果函数返回NULL,则加载失败。

LoadLibrary方法可以动态加载一个DLL并返回句柄。通过句柄可以获取动态库中函数的地址。例如:

HMODULE hDll = LoadLibrary("test.dll");

if(hDll != NULL) {

  typedef int(*pFunc)(int, int);

  pFunc func = (pFunc)GetProcAddress(hDll, "add");

  int result = func(1, 2);

  printf("%d\n", result);

  FreeLibrary(hDll);

}

上述代码中,LoadLibrary函数加载了名为“test.dll”的动态库,并返回了该动态库的句柄。通过GetProcAddress函数可以获取动态库中函数“add”的地址,最后通过函数指针调用函数“add”。

方法二:dlopen

dlopen方法是Linux系统下的一种动态库加载方式。该方法的函数原型为:

void* dlopen(const char* filename, int flag);

其中,filename是要加载的动态库文件名,flag是打开方式。函数返回值是一个void*类型的句柄,如果函数返回NULL,则加载失败。

dlopen方法可以动态加载一个共享库并返回句柄。通过句柄可以获取共享库中函数的地址。例如:

void* handle = dlopen("libtest.so", RTLD_LAZY);

if(handle != NULL) {

  typedef int(*pFunc)(int, int);

  pFunc func = (pFunc)dlsym(handle, "add");

  int result = func(1, 2);

  printf("%d\n", result);

  dlclose(handle);

}

上述代码中,dlopen函数加载了名为“libtest.so”的共享库,并返回了该共享库的句柄。通过dlsym函数可以获取共享库中函数“add”的地址,最后通过函数指针调用函数“add”。

方法三:LoadLibraryEx

LoadLibraryEx方法是Windows系统下的一种动态库加载方式,与LoadLibrary方法相比,它具有更多的扩展功能。该方法的函数原型为:

HMODULE LoadLibraryEx(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFlags);

其中,lpFileName是要加载的动态库文件名,hFile是文件句柄,dwFlags是加载方式。函数返回值是一个HMODULE类型的句柄,如果函数返回NULL,则加载失败。

LoadLibraryEx方法可以动态加载一个DLL并返回句柄。通过句柄可以获取动态库中函数的地址。例如:

HMODULE hDll = LoadLibraryEx("test.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);

if(hDll != NULL) {

  typedef int(*pFunc)(int, int);

  pFunc func = (pFunc)GetProcAddress(hDll, "add");

  int result = func(1, 2);

  printf("%d\n", result);

  FreeLibrary(hDll);

}

上述代码中,LoadLibraryEx函数加载了名为“test.dll”的动态库,并返回了该动态库的句柄。通过GetProcAddress函数可以获取动态库中函数“add”的地址,最后通过函数指针调用函数“add”。

总结:

本文介绍了C++加载动态库的三种方法,分别是LoadLibrary、dlopen和LoadLibraryEx。这些方法都具有各自的优缺点,需要根据实际情况选择合适的方法。掌握这些方法对于C++程序员来说是非常重要的。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复