1. 程式人生 > >程式設計菜鳥---正在努力進階

程式設計菜鳥---正在努力進階

  本教程的目的是告訴你如何使用ATL建立一個COM伺服器,並使用Visual C++和Visual Basic程式來分別呼叫這個伺服器。我並不想深入探討COM的細節,也不想讓你深陷於IDL之中。這一教程只是為VC++的新手程式設計師設計的,告訴他們利用ATL來建立一個COM物件有多麼簡單,並讓他們能對ATL產生更多的興趣。 ­ 第1步:啟動ATL COM Wizard ­ 你所需要做的第一件事情就是啟動Visual C++並建立一個新的工程,選擇“ATL COM Wizard”,工程名為“Simple_ATL”。設定好工程的路徑之後,單擊OK按鈕。你會看到,螢幕上給了你若干選項。第一個選項為“Server Type”。我們將要建立一個伺服器DLL,所以請確認伺服器的型別選為“Dynamic Link Library”。我們並不需要關心下面的其它三個複選框,所以我們可以將它們忽略掉。按下Finish按鈕,這樣嚮導就會為你產生適當的檔案了。之後,一個“New Project Information”視窗就會出現,你可以從上面得知嚮導都會建立什麼檔案,按下“OK”接受這一切。 ­ 第2步:建立一個新的ATL物件
­ 請確認你能在VC++的IDE中看到Workspace View,如果不能的話則請單擊“View”選單,然後選擇“Workspace”。在這個檢視中你會看到三個選項卡,請單擊“ClassView”欄,你應該會看到“Simple_ATL Classes”。請在此右擊滑鼠鍵,並在彈出選單中選擇“New ATL Object”,你將會看到下面這樣的視窗: ­ com_atl1.gif ­ 預設的選擇項“Simple Object”就是我們所要的了,請單擊next按鈕,你會來到“ATL Object Wizard Properties”視窗中。在“Short Name”文字框中輸入“First_ATL”。請注意,這時候嚮導就會自動地填寫其它的文字框。然後,單擊頂部的“Attributes”標籤,在這裡你需要做一些選擇。第一項執行緒模型(Threading Model)的選擇,我們選擇預設的單元(Apartment)模型。對於介面(Interface),我們選擇雙重(Dual)。最後,因為我們的程式與聚合(Aggregation)無關,所以我們選擇“No”的單選按鈕。你不必關心底部的三個複選框,直接單擊OK就可以了,這時候嚮導就會為我們建立一個新的ATL簡單物件。 ­ com_atl2.gif
­ 第3步:新增一個方法 ­ 如果你現在在工作區中單擊了“ClassView”標籤,那麼你會注意到嚮導在其中添加了一串東西。我們想新增的第一個東西是一個方法,可以在“IFirst_ATL”上右擊滑鼠鍵,並選擇“Add Method”。 ­ com_atl3.gif ­ 一旦你單擊了“Add Method”之後,你就會看到“Add Method to Interface”視窗。在返回值型別(Return Type)處你會看到,這個方法會預設返回HRESULT,在大多數情況下你不需要改變它。下一個文字框允許我們輸入方法的名稱,我們可以輸入“AddNumbers”。最後一個文字框是讓我們輸入引數的,由於我們想做兩個數的相加並獲得一個返回的結果,所以我們需要三個引數,並且最後一個引數是一個指標。現在,我們不必看那關於IDL的300頁教程了,可以直接在引數文字框中輸入: ­ [in] long Num1, [in] long Num2, [out] long *ReturnVal ­ 簡單地說來,我們聲明瞭兩個long型別的引數,這兩個值是傳入的([in]),還有一個最後傳出的返回值結果([out])。(你第一次看到這樣的東西可能會有些奇怪,但是如果你讀了一兩本關於COM的書的話,就會覺得親切多了。)現在就可以單擊OK按鈕了。然後,單擊“ClassView”標籤,並展開所有的“+”標誌,使得樹型檢視完全展開。你會在介面(IFirst_ATL)的頂部看到我們的“AddNumbers”方法以及我們給予它的引數。在這個方法上雙擊滑鼠鍵,並插入以下的程式碼: ­ STDMETHODIMP CFirst_ATL::AddNumbers(long Num1,                 long Num2, long *ReturnVal) {     // TODO: Add your implementation code here     *ReturnVal = Num1 + Num2; ­     return S_OK; } ­ 第4步:編譯DLL
­ 無論你相信與否,你已經擁有一個用ATL編寫的COM伺服器了!當然,我們還需要編譯它。請按下F7鍵,這樣VC++就可以編譯了。編譯器工作片刻後就會在登錄檔中註冊你的新DLL了,這樣一來其它的程式就可以使用它了。讓我們來測試一下。 ­ 第5步:在Visual Basic中測試COM伺服器 ­ 那麼,先讓我們用VB來測試這個COM伺服器吧。(如果你沒有VB的話,你可以跳過這一節,直接在VC++中測試。)啟動VB,並選擇“標準EXE(Standard EXE)”建立工程,並在對話方塊上放置一個命令按鈕。現在,我們需要新增COM伺服器的引用,請單擊“工程(Project)”選單並選擇“引用(References)”,找到“Simple ATL 1.0 Type Library”並選擇它。 ­ com_atl4.gif ­ 單擊確定(OK)按鈕之後,你可以雙擊先前放置的命令按鈕,VB會切換到這個按鈕的程式碼視窗。新增以下的程式碼: ­ Private Sub Command1_Click()     Dim objTestATL As SIMPLE_ATLLib.First_ATL     Set objTestATL = New First_ATL ­     Dim lngReturnValue As Long ­     objTestATL.AddNumbers 5, 7, lngReturnValue ­     MsgBox "The value of 5 + 7 is: " & lngReturnValue ­     Set objTestATL = Nothing End Sub ­ 如果你是個VB的程式設計師,那麼這些程式碼對於你是很直觀的:我們聲明瞭一個物件,並從COM伺服器呼叫“AddNumbers”的方法,然後顯示結果。現在按下F5來執行這個VB工程,單擊命令按鈕,你就會看到期望的結果了: ­ com_atl5.gif ­ 並不是很難吧?那麼我們再來一次,這一次用VC++。 ­ 第6步:在Visual C++中測試COM伺服器 ­ 如果你的Simple_ATL工程仍然開著,那麼就關了它並建立一個新工程。選擇“Win32 Console Application”,起名為“Test_ATL”,在下一個視窗中單擊OK按鈕接受所有預設值,最後單擊Finish按鈕。現在,你應該有了一個空工程。那麼,按下Ctrl+N為工程加入一個新檔案,選擇“C++ Source File”並命名為“Test_ATL.cpp”,單擊OK接受。你現在應該有了一個開啟的空白檔案,我們需要在其中新增一些程式碼來測試COM伺服器。程式碼如下: ­ // 你需要指明Simple_ATL工程的路徑來引用這個標頭檔案 ­ #include "../Simple_ATL/Simple_ATL.h" #include <iostream.h> ­ // 把以下的內容從Simple_ATL工程目錄的Simple_ATL_i.c檔案中複製過來 // 注意:你也可以直接包含Simple_ATL_i.c檔案,我在此只想清楚地表明這些const常量來自何處以及它們的樣子 ­ const IID IID_IFirst_ATL =     {0xC8F6E230,0x2672,0x11D3,     {0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}}; ­ const CLSID CLSID_First_ATL =     {0x970599E0,0x2673,0x11D3,     {0xA8,0xA8,0x00,0x10,0x5A,0xA9,0x43,0xDF}}; ­ void main(void) {     // 宣告一個HRESULT變數以及一個Simple_ATL介面的指標     HRESULT         hr;     IFirst_ATL      *IFirstATL = NULL; ­     // 現在初始化COM     hr = CoInitialize(0); ­     // 使用SUCCEEDED巨集來看看我們是否能夠獲得介面的指標     if(SUCCEEDED(hr))     {         hr = CoCreateInstance( CLSID_First_ATL, NULL,             CLSCTX_INPROC_SERVER,             IID_IFirst_ATL, (void**) &IFirstATL); ­         // 如果成功了,那麼呼叫AddNumbers方法         // 否則給使用者顯示一條適當的資訊         if(SUCCEEDED(hr))         {             long ReturnValue; ­             IFirstATL->AddNumbers(5, 7, &ReturnValue);             cout << "The answer for 5 + 7 is: "                 << ReturnValue << endl;             IFirstATL->Release();         }         else         {             cout << "CoCreateInstance Failed." << endl;         }     }     // 解除安裝COM     CoUninitialize(); } ­ 第7步:編譯並執行程式 ­ 現在你可以按下F5鍵來編譯程式,然後按下Ctrl+F5來執行之。你應該可以看到一個DOS視窗,給出了你所期望的結果。