Developing COM Components using VC-ATL(1) (轉)

amyz發表於2007-11-28
Developing COM Components using VC-ATL(1) (轉)[@more@]

用ATL建立COM


一、建立一個模型(工程) MyProj。
二、給模型(工程)增加一個元件 MyCom。
三、給元件增加方法() MyF1、MyF2、MyF3、MyF4。:namespace prefix = o ns = "urn:schemas--com::office" />


一、建立模型(工程) MyProj
在VC++6.0工作平臺中,點選選單 File 下的 New 選單項,在出現的 New 對話方塊中選中 Projects 卡片,在列表框中選中 ATL COM  AppWizard(活動模板庫元件導航)。  

在 Project Name 編輯框中輸入專案名如 MyProj ,並選擇合適的 Location 後,按確認按鈕進入下一個對話方塊:ATL  COM  Appwizard  -  step 1 of  1,在 Server Type 中選擇 Dynamic  Link  Library [ DLL ],即程式內,這是最快的元件。
選中 Support  MFC 選擇項。
在按下 Finish 和 Ok 按鈕後,一個元件的已經建立。


二、給模型增加元件MyCom
在VC++ 選單 Insert 中選中 New ATL  …選單項,出現 ATL Object  Wizard 對話方塊。
在左邊的 Category 中選擇 Objects,右邊的 Objects 中選中 Simple  Object 項。按 Next 按鈕。

在出現的 ATL Object  Wizard 屬性對話方塊中 Names 卡片中的八個編輯框中左上方的 Short Name 編輯框中輸入短名如 My,其他七個編輯框的內容會自動生成。然後按確認按鈕退出。


三、給元件增加方法(函式) MyF1、MyF2、MyF3、MyF4
在 VC++工作平臺的左邊的 Workspace 的 ClassView 卡片中找到介面 IMyCom 項,按右鍵,在出現的快捷選單中選擇 Add  Method …,出現 Add  Method  to Interface 對話方塊,在對話方塊中輸入要增加的函式的函式名、引數和返回值型別。然後,按確認按鈕退出。

先增加函式 MyF1:
 函式名為: MyF1
 引數:無

在MyCom.cpp中插入程式碼:
STDMETHODIMP CMyCom::MyF1()
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState())

 // TODO: Add your implementation code here
 AfxMessageBox("歡迎使用我的元件");
 return S_OK;
}

用同樣的方法給元件增加函式MyF2:
函式名為: MyF2
引數為:
 [in] BSTR str,
 [out, retval] int* val

插入程式碼:
STDMETHODIMP CMyCom::MyF2(BSTR str, int *val)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState())

 // TODO: Add your implementation code here
 CString  sStr(str);
 int  n = sStr.GetLength();
 *val = n;
 return S_OK;
}

用同樣的方法給元件增加函式 MyF3:
函式名為: MyF3
引數為:
 [in] BSTR str,
 [out, retval] BSTR* retstr

插入程式碼:
STDMETHODIMP CMyCom::MyF3(BSTR str, BSTR *retstr)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState())

 // TODO: Add your implementation code here
 CString sStr(str);
 CString sRetstr = "元件收到你的資訊:n特此告之。";
 CComBSTR  temp(sRetstr);
 *retstr = temp;
 return S_OK;
}

用同樣的方法給元件增加函式MyF4:
函式名為: MyF4
引數為:
 [in] int x,
 [out, retval] int* val

插入程式碼:
STDMETHODIMP CMyCom::MyF4(int x, int *val)
{
 AFX_MANAGE_STATE(AfxGetStaticModuleState())

 // TODO: Add your implementation code here
 *val = x+1;
 return S_OK;
}

編繹工程,生成元件DLL。

如果是在 或者 的上完成了上面的三步操作,就會在 de 子目錄下生成元件的 DLL 檔案,並且完成自動註冊。但是在 的計算機上,註冊要執行如下命令才能完成:
regsrv32 C:MyProjDebugMyProj.dll



建立 COM 元件客戶


1,建立一個基於對話方塊的客戶。
2,把伺服器型別庫匯入客戶工作平臺。
3,初始化 COM 庫。
4,獲得伺服器的 GLSID。
5,建立 COM 元件伺服器元件的例項。
6,使用 COM 。
7,終止 COM 庫。


1,建立一個客戶程式
用 MFC  AppWizard ( exe ) 建立一個基於對話方塊的應用程式 MyExe。
在對話方塊中放置四個按鈕,分別為 MyF1、MyF2 、MyF3和 MyF4。
用 ClassWizard 生成單擊按鈕的四個響應函式 OnMyF1() 、OnMyF2() 、OnMyF3()和 OnMyF4()。


2,把伺服器型別庫匯入客戶
2-1在 StdAfx.h 檔案中加入程式碼:

#import  "..MyProjMyProj.tlb"

最後的StdAfx.h檔案如下:
// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//  are changed infrequently
//

#if !defined(AFX_STDAFX_H__2B646017_28AD_4CDE_9792_CB8F9A5C6B39__INCLUDED_)
#define AFX_STDAFX_H__2B646017_28AD_4CDE_9792_CB8F9A5C6B39__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define VC_EXTRALEAN // Exclude rarely-used stuff from headers

#include   // MFC core and standard components
#include   // MFC extensions
#include   // MFC Automation classes
#include  // MFC support for Inte Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include  // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT

#import  "..MyProjMyProj.tlb"

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__2B646017_28AD_4CDE_9792_CB8F9A5C6B39__INCLUDED_)

編譯 StdAfx.cpp,
這樣在客戶端的debug目錄下生成元件的型別庫標頭檔案(.tlh)和型別庫實現檔案(.tli)。

2-2在使用元件的原始檔上方使用名字空間,最後的原始檔上面部分程式碼如下

// MyExeDlg.cpp : implementation file
//

#include "stdafx.h"
#include "MyExe.h"
#include "MyExeDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

using namespace MYPROJLib;

以下程式碼略

3,初始化 COM 庫
HRESULT hr=CoInitialize(NULL);


4,獲得伺服器元件的 CLSID
CLSID  clsid; 
hr=CLSIDFromProgID(OLESTR("MyProj.MyCom"),&clsid);

if(FAILED(hr))

{

  AfxMessageBox("COM Failed");

  return;

}


5,建立 COM 伺服器元件例項,獲得元件介面指標
IMyCom  *ptr = NULL;
hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(IMyCom),(LPVOID*)&ptr); 


6-1,在OnMyF1()中使用 COM 物件 MyF1()

ptr->MyF1();
ptr->Release(); // 釋放例項


6-2,在OnMyF2()中使用 COM 物件 MyF2()
char str[32];

sprintf(str,"Len=%d",ptr->MyF2("abcdefg"));

AfxMessageBox(str);

ptr->Release();// 釋放例項


6-3,在OnMyF3()中使用 COM 物件 MyF3()
AfxMessageBox(ptr->MyF3("abcdefg"));

ptr->Release(); // 釋放例項


6-4,在OnMyF4()中使用 COM 物件 MyF4()

int x=8; char str[32];

sprintf(str,"x=%d,x+1=%d",x,ptr->MyF4(x));

AfxMessageBox(str);

ptr->Release();// 釋放例項

7,終止 COM 庫
CoUninitialize();

(未完,待續)


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-985662/,如需轉載,請註明出處,否則將追究法律責任。

相關文章