ACE dl接口编写以及dll的ACE调用(包括:类形式接口编写以及调用)

来源:互联网 发布:出塞曲性人盒 知乎 编辑:程序博客网 时间:2024/06/05 05:19


最近深深感受到掌握一种新的知识时,写成博客很重要。第一可以加深印象,第二可以提高自己的编写能力,第三可以整理自己的思路,第四以后忘记时可以第一时间浏览自己的博客。这是小弟第一个博客,有什么不足的地方,欢迎指正。谢谢。


最近需要将网络通信接口封装成DLL的形式,又需要跨平台,选择的第三方库是:ACE。

ACE有自己的一套加载DLL方法,下面开始一一讲解。


分2点讲解ACE 中DLL的编写和调用。


第一点:普通接口函数。

eg:

///////   test.h  //////

#include "ace/svc_export.h"       //  用到ACE_Svc_Export时需要包含此头文件。

// 头文件中定义接口函数

extern "C" ACE_Svc_Export int func();


/////   test.cpp   ///////

// cpp中实现此函数

int func()
{
    return 123456;
}


注意点

#if defined(_WIN32)
    #ifdef DLL_PROJECT_EXPORTS
    #define START_API __declspec(dllexport)
    #else
    #define START_API __declspec(dllimport)
    #endif
#endif

#if  defined(__linux)
    #define  START_API
#endif

// 提供接口

extern "C" START_API bool Send(const void* msg, unsigned int len, unsigned long ulTimeout);

这是之前使用的方法,这是WINDOWS下的一套方法,这种形式也可以。但是ACE已经提供了一种很方便很简洁的方法,就是刚说提到的那样。


将test工程编译成DLL。


下面讲解使用以上编译的DLL。

调用时包含上面的接口头文件,以及将上面的DLL复制到当前目录进行使用。

/////  main.cpp  /////

#include "test.h"


//  使用ACE_DLL需要包含的头文件

#include "ace/DLL.h"
#include "ace/OS.h"

#include "ace/Auto_Ptr.h"


// 声明DLL接口

typedef int (*test)();


int main()

{


    // 打开dll

ACE_DLL dll;
    int retval = dll.open(ACE_DLL_PREFIX ACE_TEXT("test"));//dll file name  注意:不需要后缀名
    if (retval != 0)   
    {   
        ACE_ERROR_RETURN ((LM_ERROR, "%p", "dll.open"), -1);
    }



void *vInfo = dll.symbol (ACE_TEXT ("func"));  // export name

    ptrdiff_t ptrInfo = reinterpret_cast<ptrdiff_t> (vInfo);
    test tt = reinterpret_cast<test> (ptrInfo);

    if (tt == 0)
    {
        return -1;
    }

   // 此处就可以调用dll中的函数了

    int res = tt();

return 0;

}



第二点:类接口函数

// test.h ////

class base

{

    public:

          virtual int func() = 0;

};

class device : public base

{

    public:

         int func();

};


// 接口声明

extern "C" ACE_Svc_Export base* Create(void);


// test.cpp ///

int device::func()

{

     return 123456;

}


写到这里有人会觉得奇怪,为什么要提供一个base纯虚接口类呢。

不提供纯虚函数接口类无法编译。我也是查找各种资料明白的。具体为什么欢迎讨论。


用法和上面写的一样,只有一点需要注意

// main.cpp ///

// 包含头文件


typedef base* (*factory)();


int main()

{

// open

// .....

void *vInfo = dll.symbol (ACE_TEXT ("Create"));  // export name  // dll中接口名

    ptrdiff_t ptrInfo = reinterpret_cast<ptrdiff_t> (vInfo);
    factory tt = reinterpret_cast<factory> (ptrInfo);

    if (tt == 0)
    {
        return -1;
    }

    //  接口类函数注意点。

    auto_ptr<device> ptr(tt()); // 注意:tt函数括号 

   // 成功调用dll中的接口放回123456.

   int result =   ptr->func();

return 0;

}


that's all。  谢谢大家。



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小车占道跟大车刮交警怎么办 邻居把消防栓的位置占用了怎么办 查环保要停业整改一个月怎么办 抽油烟机管道公共排烟道漏烟怎么办 深圳龙华电动车被交警扣了怎么办 英国平邮寄到中国丢件怎么办 安卓app与设备不兼容怎么办 手机卡坏了收不到快递短信怎么办 pph手术后钛钉没有脱落怎么办 右侧附件囊状透明声可怎么办 刚刚出生小孩睾丸没有掉下来怎么办 汽车被依非法营运之由扣押怎么办 老婆结婚小孩两个又上夜场该怎么办 对于不断无理要求赔偿的房东怎么办 欠的钱越来越多不知道怎么办了 手机壳的开机按键不好按怎么办 对方把保权的房子卖给我怎么办 内存卡在手机上显示损坏怎么办 内存卡显示但是下载不了东西怎么办 相机sd卡没办法读卡怎么办 尼康相机新sd卡显示满了怎么办 修冰箱没几个月又坏了怎么办 星露谷物语活动中心成了仓库怎么办 你家如果油锅起火时应该怎么办 当你遇到电器起火时应该怎么办 酷派大神f2充不进去电怎么办 借车子别人开违章一年了怎么办 快递刚发货我点错了收货怎么办 快递收货地址错了已经发货了怎么办 老公在外地工地上夜班吃不好怎么办 工人在工地干活被吊车撞了怎么办 小米手机记不得保密柜密码怎么办 华为手机文件保密柜密码忘了怎么办 超市寄存柜密码纸丢了怎么办 佳明软件安装不到手机上怎么办 最好的朋友的抢了自己的活怎么办 支付宝被实名验证上限了怎么办 装修预留插座被挡了一半怎么办 衣服放在柜子里面有味道怎么办 河北发货一个柜到天津港口怎么办 家用潜水泵更换电容后压力小怎么办