版权声明:转载时请以超链接形式标明文章原始出处和作者信息及
本声明
http://egeho123.blogbus.com/logs/14071965.html
http://egeho123.blogbus.com/logs/14071965.html
1 引言
接触ACE已经有长一段时间了,但一直来没有应用的实际需求,因此这方面的学习进展一直很慢,到目前才初步学习了一下日志、TCP/UDP简单网络程序的编写。最近由于工作需要的驱使,学习了ACE_DLL这个类。下面我将从一个完全初学者的角度,谈谈如何认识和了解ACE。
2 初识ACE
刚开始听到ACE这个词,我就对它产生了兴趣,因为据说它提供了跨平台的网络编程,能够在UNIX下跑自己写的网络程序,兴奋啊。于是第二天,就去书店买了本《ACE程序员指南》(
Stephen
D. Houston
著,马维达
译,中国电力出版社出版),那天晚上搞了很久终于在
VC60
上搭建了环境,跑了第一个程序,感觉非常良好。
STOP
!!!废话不说了,下面转入正题,谈谈
ACE
环境的搭建吧。
3 ACE
开发环境的搭建
3
.
1
获取最新版的
ACE
安装包
去这个网址(
http://www.cs.wustl.edu/~schmidt/ACE.html
)获取一个最新发布(
Latest Release
)的
ACE
包,然后安装到你的计算机上。
3
.
2
环境变量的设置
假设你将
ACE
安装到了“
D:\ACE\ACE_wrappers
”,那么按照如下步骤进行环境变量的设置:
(1)
鼠标右击“我的电脑”选择“属性
-
à
高级
-
à
环境变量”,出现以下界面:
图1 ACE环境变量的设置
(2)
新建变量为“
ACE_ROOT
”
,
值为“
D:\ACE\ACE_wrappers
”的环境变量。然后退出,重新启动你的电脑,设置完后
必须重启电脑
,才能生效!!!!!!!!!!!!!!!!!
3
.
3
编译
ACE
上面两步做完了之后,我们需要自己编译得到
DLL
和相应的
LIB
,我们需要进行两次编译。一次以
DEBUG
方法编译,生成的
DLL
和
LIB
名称为:
ACEd.dll
和
ACEd.lib
。另一次以
RELESE
方式编译,生成的
DLL
和
LIB
名称为:
ACE.dll
和
ACE.lib
。
编译完成之后,生成的动态库都在“
$ACE_ROOT\lib
”
(
即:
D:\ACE\ACE_wrappers\lib)
目录下。
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!")));
cin.get();
return 1;
}
(
6
)编译,哈哈,弹出下面的错误提示,图
10
:
图
10
出错了
(
7
)
赶快从
$ACE_ROOT\lib
中把
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的成员,包括从基类继承的成员。
[explicit]
| ||
[explicit]
| ||
[private]
| ||
[private]
| ||
[private]
| ||
[private]
| ||
[private]
| ||
[private]
| ||
[private]
| ||
表一
ACE
的所有成员列表
6
.
2
几个关键的方法介绍:
参数说明:
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
参数说明:
1)
symbol_name
:需要调用的DLL库中的方法或对象的名称;
2)
ignore_errors
:当值为1时,在日志中不生成错误信息,如果为0,那么在日志中生成错误信息;
参数说明:
没有参数,关闭打开的动态库
6
.3 一个详细的例子介绍:
例子里面:
(1)CSon继承了CBase里的一个纯基类,编译的时候,CSon需要依赖CBase。
(2)CBase需要调用CSon里面一个函数,得到基类的一个对象的指针,来使用。
(3)testacedllcall工程是用来调用CBase里的函数,来测试的。