最近才知道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