首页 > 其他 > 详细

ACE_DLL示例

时间:2014-03-06 18:09:23      阅读:606      评论:0      收藏:0      [点我收藏+]

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

A.cpp

#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类型的项目中生成dll,在 相邻的project中准备引用这个dll


新创建一个用来引用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;
};



这里没有讲环境搭建等信息,在其他文章中有

运行结果如下:


bubuko.com,布布扣

ACE_DLL示例,布布扣,bubuko.com

ACE_DLL示例

原文:http://blog.csdn.net/calmreason/article/details/20607443

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!