QT 调用DLL 实现原理
admin
2023-07-25 09:22:28
0次

1)win下动态库调用有关的函数包括: 
(1)LoadLibrary,装载动态库。 
(2)GetProcAddress,获取要引入的函数,将符号名或标识号转换为DLL内部地址。 
(3)FreeLibrary,释放动态链接库。
2)unix上与动态库调用有关的函数包括:
(1)_打开动态链接库:dlopen,函数原型void *dlopen (const char *filename, int flag); 
dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄。 
(2)取函数执行地址:dlsym,函数原型为: void *dlsym(void *handle, char *symbol); 
dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。 
(3)关闭动态链接库:dlclose,函数原型为: int dlclose (void *handle); 
dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。 
(4)动态库错误函数:dlerror,函数原型为: const char *dlerror(void); 当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。

我们来分析下Qt的源代码,看看Qt是如何封装这两种不同的调用动态库的方法。

下面是我用vc编写的一个动态库中的函数add:
extern "C" __declspec(dllexport) int __stdcall add(int a,int b)
{
    return a+b;
}

下面我就用QLibrary来调用一下:

QLibrary lib("QtDllTest.dll");
if (lib.load())
{
    typedef int(*AddFunction)(int a,int b);
    AddFunction Add=(AddFunction)lib.resolve("add");
    if (!Add)
    {
        cout<<"failed"<    }
    else
    {
       int m;
       m=Add(1,1); //来个计算1+1
       cout<<"result:"<    }
    lib.unload();
}
else
{
    cout<<"failed"<}


首先将目录切换到QTDIR/src/corelib/plugin,这里面就是QLibrary实现的源代码,打开qlibrary_p.h(熟悉了Qt的常用手法,就知道,这就是QLibrary内部实现的代码),可以看到
    bool load_sys();
    bool unload_sys();
    void *resolve_sys(const char *);
三个函数。在qlibrary.cpp中可以找到调用这三个函数的地方
bool QLibrary::load ()调用了load_sys;
bool QLibrary::unload ()调用了unload_sys;
void * QLibrary::resolve ( const char * symbol )调用了resolve_sys

但是并没有找到这三个函数的实现,这是这么回事呢?
打开QTDIR/src/corelib/plugin/plugin.pri文件,
win32 {
 SOURCES += plugin/qlibrary_win.cpp
}

unix {
 SOURCES += plugin/qlibrary_unix.cpp
}

原来如此啊。

我们仔细看下qlibrary_win.cpp文件,load_sys函数调用了LoadLibrary,unload_sys调用了FreeLibrary,resolve_sys调用了GetProcAddress。
而在qlibrary_unix.cpp文件中,各种linux平台又分好多种。但是基本上load_sys调用了dlopen,unload_sys调用了dlclose,resolve_sys调用了dlsym。
在HPUX中dlopen对应shl_load,dlclose对应shl_unload,dlsym对应shl_findsym。

原来QLibrary就是这样实现不同平台动态库的调用。


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...