Vs2008 編寫com,MFC編寫客戶端調用

原文地址:VS2008下ATL應用實例作者:just_for_h264

目前MFCATL代表了兩種框架,分別面向不同類型的基於Windows的開發。

 

MFC代表了創建獨立的Windows應用的一種簡單、一致的方法;

ATL提供了一種框架來實現創建COM客戶機和服務器所必須的樣板文件代碼。

 

ATLActive Template Library,活動模板庫),是一種微軟程序庫,支持利用C++語言編寫ASP代碼以及其它ActiveX程序。

通過活動模板庫可建立COM組件,然後通過ASP頁面中的腳本對COM對象進行調用。

這種COM組件可以包含屬性頁、對話框等等控件。

 

 建立COM服務程序

 

1.創建工程

   File-> New... ->Project->ATL COM AppWizard

   (1) 選擇COM服務程序的類型

  - 動態連接庫: 最終產生一個動態連接庫(DLL)形式的COM服務程序

  - 應用程序:最終產生一個可執行程序類型(EXE)COM服務程序;

  - NT服務::產生一個以NT服務方式運行的COM服務程序。

  (2)允許支持MFCATL的工程設置中允許在ATL工程內部支持使用MFC即可以使用MFC定義的類,而不必直接使用Windows SDK。  

   [轉載]VS2008下ATL應用實例

2. 加入ATL

   在解決方案資源管理器視圖中,在SimpleTest工程上單擊右鍵->添加->->ATL簡單對象(對於一般COM服務程序,使用的簡單對象即可),設置對象名爲SimpleInterface3. 加入接口定義,實現接口函數

 

3. 加入接口定義,實現接口函數

 

加入了ATL類定義之後, Class View下來檢查生成的類定義的情況。可以看到一個新的類已經生成,同時,還生成了相應的接口定義ATL Object Wizard爲我們生成了類定義的.h 和.cpp文件,此外還有用於接口定義的IDL文件。有了這些文件以後,我們就可以爲接口加入成員函數,完成類的定義。

具體方法:

首先在Class View中選中相應的接口,顯示爲接口ISimpleInterface,單擊鼠標右鍵打開菜單,此彈出式菜單定義了爲接口加入屬性和方法的操作。

[轉載]VS2008下ATL應用實例

 

選取Add Method...定義welcome方法:返回類型爲COM規定的HRESULT類型,參數爲pVal,參數類型爲long *

 

Add Method...可爲接口加入方法成員

 Add Property...可爲接口加入新的屬性成員

 [轉載]VS2008下ATL應用實例

方法成員加入以後,我們可以通過Class View來檢查ATL爲我們所做的工作。

首先我們看到ATL在接口的定義中加入了該方法的定義;同時在對應的ATL類定義中,也加入了一個相應的方法的定義;在類對應的.cpp文件中,加入了此方法的實現框架。此後,我們只要在這個函數框架中加入該方法的代碼邏輯,一個接口函數的定義和實現就基本完成。依照這種方式,我們可以完成整個COM對象的定義和實現。

 

4.添加函數實現

SimpleInterface.cpp中,修改代碼如下:

STDMETHODIMP CSimpleInterface::Welcome(void)

{

       AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

       // TODO: 在此添加實現代碼

       AfxMessageBox(_T("Welcome!"));

       return S_OK;

}

 

 

二.建立COM客戶程序

上面步驟完成後,生成一個簡單的COM服務程序,而且已經被註冊到當前系統中。

下面我們要完成一個簡單的COM客戶程序。一個COM客戶程序簡單地說是使用COM組件對象的程序

 (1) 創建COM對象的實例

調用Windows系統的API函數CoCreateInstance來完成。

(2)通過接口調用函數。

(3) 釋放COM對象實例

  調用IUnknown::Release釋放COM對象實例

  

客戶程序是使用MFC編寫的一個基於對話框的簡單應用程序。具體的過程如下: 

 創建一個稱爲SimpleClient的基於對話框的MFC工程

[轉載]VS2008下ATL應用實例

  在對話框中加入一個按鈕,名字爲Test

  在SimpleClient.cpp文件中加入如下的代碼:

  (1) 在cpp文件 #include “SimpleClientdlg.h”之後加入下面的代碼:

 #include "E:/Exercise/SimpleTest/SimpleTest/SimpleTest_i.h"

#include "E:/Exercise/SimpleTest/SimpleTest/SimpleTest_i.c"  

// 根據需要修改頭文件的路徑

  加入的頭文件是在編譯COM服務程序過程中自動生成的,其中包含接口本身的定義、接口IID的定義和COM對象的CLSID的定義。包含該頭文件可以使客戶程序能夠使用COM服務程序。

  (2) 在按鈕TEST的消息控制函數改爲:

  void CSimpleClientDlg::OnBnClickedTest()

{

// TODO: 在此添加控件通知處理程序代碼

       CoInitialize(0);

       HRESULT hr;

       ISimpleInterfacepIntf = NULL;

       hr = CoCreateInstance(CLSID_SimpleInterfaceNULLCLSCTX_SERVER ,

       IID_ISimpleInterface, (void **)& pIntf);

       if(SUCCEEDED(hr))

       {

              pIntf->Welcome();

              pIntf->Release();

       }

       CoUninitialize();

}  

 

上面的代碼首先通過系統API CoCreateInstance創建COM對象,得到接口的指針,然後調用接口成員函數Welcome,最後通過IUnknown::Release()函數釋放COM對象實例。

  編譯連接客戶程序

最後,我們可以測試客戶程序是否正常運行。啓動客戶程序,當單擊“TEST”按鈕時我們可以看到彈出一個消息框,這正是我們的COM服務程序提供的功能。

測試結果如下:
[轉載]VS2008下ATL應用實例

 

發佈了29 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章