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"是为防止编译器自动改名;

  • 相关阅读:
    华为交换机LACP模式(动态)链路聚合配置示例
    H3C交换机配置链路聚合
    ODBC数据源的作用及配置
    SQL Server Management Studio与SQL Server Configuration Manager
    SQL Server 2008 允许远程连接的解决方法
    多实例并存的技术限制,与原因
    多个SQL server实例
    SQL Server实例
    Oracle
    Burp Suite Professional更换闪退日记
  • 原文地址:https://www.cnblogs.com/me115/p/2035300.html
Copyright © 2011-2022 走看看