版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及
本聲明http://egeho123.blogbus.com/logs/14071965.html1 引言
接觸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裏的函數,來測試的。