zoukankan      html  css  js  c++  java
  • unix动态链接库操作

    dlopen:打开一个动态链接库;

    dlclose:关闭动态链接库;

    dlsym():从dll中提取函数指针以供调用;

    例:

    /////////////////////////////DLLTest.cpp//////////////////////////////////////////////////////
    #include "DateTime.h"
    #include <dlfcn.h>
    #include <iostream>
    using namespace std;
    
    typedef int(*FuncDatePtr)(DateType* d);
    
    int main(int argc,char* argv[])
    {
    DateType d;
    //TimeType t;
    void* dp=0;
    char* error=0;
    cout<<"Dll Programe Demo:"<<endl;
    dp=dlopen("libtime.so",RTLD_NOW);
    if(dp==0)
    {
    cout<<"Open time.so Failed!"<<dlerror()<<endl;
    return 1;
    }
    //int(*f)(DateType* d);
    FuncDatePtr f=(FuncDatePtr)dlsym(dp,"getdate2");
    //void* test=dlsym(dp,"getdate");
    //funcDate=(FuncDate)funcDate;
    error=dlerror();
    if(error)
    {
    cout<<"ERROR:"<<error<<endl;
    return 1;
    }
    f(&d);
    cout<<"Today Year="<<d.year<<endl;
    dlclose(dp);
    return 0;
    }
    
    //////////////////DateTime.h/////////////////////////
    #ifndef DATETIME_H_
    #define DATETIME_H_
    
    #ifdef __cplusplus
    extern "C"{
    #endif
    
    struct DateType
    {
    int year;
    int month;
    int day;
    };
    
    struct TimeType
    {
    int hour;
    int minute;
    int second;
    };
    
    
    int getdate2(DateType* d);
    
    int gettime2(TimeType* t);
    
    #ifdef __cplusplus
    }
    #endif
    
    
    ///////////////////////////////////////DateTime.cpp////////////////////////////////////////////////////
    #include <time.h>
    #include <iostream>
    #include "DateTime.h"
    using namespace std;
    
    
    int getdate2(DateType* d)
    {
    long ti;
    struct tm *tm;
    time(&ti);
    tm=localtime(&ti);
    d->year=tm->tm_year+1900;
    d->month=tm->tm_mon+1;
    d->day=tm->tm_mday;
    cout<<"function getdate() loaded!"<<endl;
    return 0;
    }
    
    int gettime2(TimeType* t)
    {
    long ti;
    struct tm *tm;
    time(&ti);
    tm=localtime(&ti);
    t->hour=tm->tm_hour;
    t->minute=tm->tm_min;
    t->second=tm->tm_sec;
    return 0;
    }

    1.FuncDatePtr f=(FuncDatePtr)dlsym(dp,"getdate2");

    等价=》

    void* vf=dlsym(dp,"getdate2");

    FuncDatePtr f=reinterpret_cast<FuncDatePtr>(vf);

    2.定义extern "C"是为防止编译器自动改名;

  • 相关阅读:
    SQL优化之博客案例
    Drools之规则属性
    Android 8.0以上系统应用如何保活
    Android 8.0(api27)静态广播和动态广播接收问题
    Android开发 WorkManager详解
    使用EOS Camera Movie Record 软件在计算机上使用 Canon EOS DSLR相机录制视频 。
    关于使用AlarmManager的注意事项
    系统服务之定时服务(AlarmManager)
    Android定时器AlarmManager
    Android 代码混淆
  • 原文地址:https://www.cnblogs.com/me115/p/2035300.html
Copyright © 2011-2022 走看看