
ACE简介以及ACE
.html
1 引言
接触ACE已经有长一段时间了,但一直来没有应用的实际需求,因此这方面的学习进展一直很慢,到目前才初步学习了一下日志、TCP/UDP简单网络程序的编写。最近由于工作需要的驱使,学习了ACE_DLL这个类。下面我将从一个完全初学者的角度,谈谈如何认识和了解ACE。
2 初识ACE
刚开始听到ACE这个词,我就对它产生了兴趣,因为据说它提供了跨平台的网络编程,能够在UNIX下跑自己写的网络程序,兴奋啊。于是第二天,就去书店买了本《ACE程序员指南》( Stephen D. Houston 著,马维达 译,中国电力出版社出版),那天晚上搞了很久终于在 VC60 上搭建了环境,跑了第一个程序,感觉非常良好。 STOP !!!废话不说了,下面转入正题,谈谈 ACE 环境的搭建吧。
3 ACE 开发环境的搭建
3 . 1 获取最新版的 ACE 安装包
去这个网址( .html )获取一个最新发布(
Latest Release )的 ACE 包,然后安装到你的计算机上。
3 . 2 环境变量的设置
假设你将 ACE 安装到了“ D:ACEACE_wrappers ”,那么按照如下步骤进行环境变量的设置:
(1) 鼠标右击“我的电脑”选择“属性 - à 高级 - à 环境变量”,出现以下界面:
图1 ACE环境变量的设置
(2) 新建变量为“ ACE_ROOT ” , 值为“ D:ACEACE_wrappers ”的环境变量。然后退出,重新启动你的电脑,设置完后
必须重启电脑 ,才能生效!!!!!!!!!!!!!!!!!
3 . 3 编译 ACE
上面两步做完了之后,我们需要自己编译得到 DLL 和相应的 LIB ,我们需要进行两次编译。一次以 DEBUG 方法编译,生成的 DLL 和 LIB 名称为: ACEd.dll 和 ACEd.lib 。另一次以 RELESE 方式编译,生成的 DLL 和 LIB 名称为: ACE.dll 和 ACE.lib 。
编译完成之后,生成的动态库都在“ $ACE_ROOTlib ” ( 即: D:ACEACE_wrapperslib) 目录下。
4 在 VS2003 中设置环境
( 1 )打开 VS2003 ,选择“工具 à 选项 - à VC++ 目录”,如图二:
图 2 VS2003 的 ACE 包含目录 /lib 库路径设置
(3) 选择“包含文件”,将 ACE_ROOT 加进入,如图 3 :
图 3 ACE 包含文件的添加
(4) 选择“库文件”,添加库文件的路径,(这个好象也可以不加哈,可以自己试一下看)如图 4 :
图 4 ACE 库文件的添加
(5) OK ,开始测试一下,写个 HELLO WORLD 吧。
5 写一个 HELLO WORLD
( 1 )新建一个“ MyFirstACE ”的 WIN32 项目,如图 5 :
图 5 :新建 HELLO WORD
( 2 )对工程进行设置,选“控制台应用程序 --- 》空项目”,如图 6 :
图 6 HELLO WORLD 应用程序的设置
( 3 )点“完成”,然后在解决方案管理器的源文件文件夹中添加一个 MyFirstACE.cpp ,如图 7 :
图 7 添家 CPP 文件
( 4 )修改工程的设置(这一步很重要):
“项目 --- 》 MyFirstACE 属性”,进入下面的属性项设置界面,将运行时库设置为“多线程调试( MTd )”:
图 8 属性项设置
然后在将链接器的输入项进行设置:如图 9 :
图 9 :设置链接器输入
点“确定”。
( 5 )添加以下源代码到 CPP 文件中:
#include "ace/Log_Msg.h"
#include <iostream>
using namespace std;
int main(int argc,char**)
{
ACE_DEBUG((LM_INFO,ACE_TEXT("HELLO WORLD!")));
();
return 1;
}
( 6 )编译,哈哈,弹出下面的错误提示,图 10 :
图 10 出错了
( 7 ) 赶快从 $ACE_ROOTlib 中把 ACEd.dll 和 ACEd.lib 拷贝一份到现在的工程目录的 DEBUG 文件夹下,如下图 11 :
图 11 包 DLL 和 LIB 拷贝到 DEBUG 文件夹
( 8 ) 再重新编译一下吧:
图 12 HELLO WORLD
多了很多信息,这些是调试信息,可以用开关关闭的。
6 ACE_DLL 动态库操作类
ACE 提供了很多很多工具给我们使用,最大优点就是跨平台并且源代码公开的。 ACE_DLL 类主要用于对 DLL 的操作。
6 . 1 成员列表
下面这个表格列举了所有ACE——DLL的成员,包括从基类继承的成员。
ACE_DLL(int close_on_destruction=1) | ACE_DLL | [explicit] |
ACE_DLL(const ACE_TCHAR *dll_name, int open_mode=ACE_DEFAULT_SHLIB_MODE, int close_on_destruction=1) | ACE_DLL | [explicit] |
ACE_DLL(const ACE_DLL &) | ACE_DLL |
close(void) | ACE_DLL |
close_on_destruction_ | ACE_DLL | [private] |
dll_handle_ | ACE_DLL | [private] |
dll_name_ | ACE_DLL | [private] |
error(void) const | ACE_DLL |
error_ | ACE_DLL | [private] |
get_handle(int become_owner=0) const | ACE_DLL |
open(const ACE_TCHAR *dll_name, int open_mode=ACE_DEFAULT_SHLIB_MODE, int close_on_destruction=1) | ACE_DLL |
open_i(const ACE_TCHAR *dll_name, int open_mode=ACE_DEFAULT_SHLIB_MODE, int close_on_destruction=1, ACE_SHLIB_HANDLE handle=0) | ACE_DLL | [private] |
open_mode_ | ACE_DLL | [private] |
operator=(const ACE_DLL &) | ACE_DLL | [private] |
set_handle(ACE_SHLIB_HANDLE handle, int close_on_destruction=1) | ACE_DLL |
symbol(const ACE_TCHAR *symbol_name, int ignore_errors=0) | ACE_DLL |
~ACE_DLL(void) | ACE_DLL |
表一 ACE 的所有成员列表
6 . 2 几个关键的方法介绍:
open(const ACE_TCHAR *dll_name, int open_mode=ACE_DEFAULT_SHLIB_MODE, int close_on_destruction=1)
参数说明:
1) dll_name :要打开的动态库名称;
2) open_mode :打开方式;
3) close_on_destruction :这个参数有两个取值,1表示在析构的时候关闭打开的句炳,0表示不关闭;
4 )如下面的例子:
ACE_DLL *P = new ACE_DLL();// 实例化一个DLL管理器
P->open("CBase",ACE_DEFAULT_SHLIB_MODE,1);// 打开一个名为CBase的DLL,打开方法为默认,是否关闭为1
symbol(const ACE_TCHAR *symbol_name, int ignore_errors=0)
参数说明:
1) symbol_name :需要调用的DLL库中的方法或对象的名称;
2) ignore_errors :当值为1时,在日志中不生成错误信息,如果为0,那么在日志中生成错误信息;
close(void)
参数说明:
没有参数,关闭打开的动态库
6 .3 一个详细的例子介绍:
例子里面:
(1)CSon继承了CBase里的一个纯基类,编译的时候,CSon需要依赖CBase。
(2)CBase需要调用CSon里面一个函数,得到基类的一个对象的指针,来使用。
(3)testacedllcall工程是用来调用CBase里的函数,来测试的。