测试了一下,是可以的,特殊情况下倒可以这样玩玩。
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
int main(int agrc, char* argv[])
{
printf("1\n");
int (*pFunc)(void*, int, int);
void *pHandle = dlopen("libtwolib-first.so", RTLD_NOW);
if(pHandle == NULL)
{
printf("1.1\n");
}
printf("2\n");
void* obj = malloc(4); // 第一步:定义对象(分配内存,一定要分够哦)
void (*confunc)(void*) = (void (*)(void*))dlsym(pHandle, "_ZN4TestC1Ev"); // 第二步:取到构造函数
pFunc = (int (*)(void*,int,int))dlsym(pHandle, "_ZN4Test8first111Eii"); // 第三步:取到成员方法
confunc(obj); // 调用构造函数
printf("3\n");
int a = pFunc(obj,10, 11); // 调用成员方法
printf("4\n");
printf("%d\n", a);
dlclose(pHandle);
return 0;
}
这是被调用的类:
class Test
{
private:
int i;
public:
Test();
int first111(int x, int y);
};
总结:
这样干很麻烦的,虽然能行,但是实际操作很困难。
因为不管如何你都知道被调用类的接口,还不如自己重写被调用者的头文件和实现,只要能让调用者编译链接通过就行,然后隐式调用。
说了这么多主要是想解决想调用别人的动态库,但是别人的头文件又很复杂,一层一层的嵌套,想编译通过都难,并且想链接通过也难,因为有时依赖很多其他的动态库。
在取屏时,我就想用这种办法搞一下,看看好使不。
经测试,用这种办法取屏完全可以。
本文探讨了如何通过动态库调用类的方法,包括加载库、获取构造函数和成员方法,以及实例化类的过程。这种方法在特定场景下可行,但存在效率和复杂性问题,通常建议直接修改头文件或使用隐式调用来简化实现。
4万+

被折叠的 条评论
为什么被折叠?



