最近才知道ACE_DLL是动态管理组件(服务)的基础,这个框架可以让你打开和关闭某个dll对应的服务。
本例最简单的调用dll中的类对象的print方法打印Hello World。
网上的例子不太好用,当时觉得既然ACE_DLL是个类库,那就是头文件包含不就行了。看了ACE下载包里面的ACE_Main项目之后仿照他的自己写了。
//子定义的类用于生成dll
A.h
#ifndef A_H #define A_H #ifdef A_EXPORTS #define A_API __declspec(dllexport) #else #define A_API __declspec(dllimport) #endif #include <iostream> class A_API A { public: A(void); ~A(void); void print(void) const ; }; //ACE_Svc_Export A *create_A (void); extern "C" A_API A* create_A(void); #endif
#include "A.h" A::A(void) { } A::~A(void) { } void A::print(void) const { std::cout<<"class A::print()"; } A* create_A(void) { return new A(); }
新创建一个用来引用dll的ACE项目,main函数如下
#include "A.h" #include "ace/Log_Msg.h" #include "ace/DLL.h" typedef A* (*A_Creater) (void); int main(int, char *[]) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("Hello, ACE !\n"))); ACE_DLL dll; int retval = dll.open(ACE_DLL_PREFIX ACE_TEXT("ProtocolA")); if (retval != 0) { ACE_ERROR_RETURN ((LM_ERROR, "%p", "dll.open"), -1); } void *void_ptr = dll.symbol (ACE_TEXT ("create_A")); ptrdiff_t tmp = reinterpret_cast<ptrdiff_t> (void_ptr); A_Creater ac = reinterpret_cast<A_Creater> (tmp); if (ac == 0) { ACE_ERROR_RETURN ((LM_ERROR, "%p", "dll.symbol"), -1); } { A* pa=ac (); pa->print(); } dll.close (); return 0; };
这里没有讲环境搭建等信息,在其他文章中有
运行结果如下:
原文:http://blog.csdn.net/calmreason/article/details/20607443