Developing COM Components using VC-ATL(1) (轉)
用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
#include
#include
#include
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include
#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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Developing COM Components using VC-ATL(2-3) (轉)dev
- Developing COM Components using VC-ATL(2-2) (轉)dev
- Developing COM Components using VC-ATL(3-3) (轉)dev
- Developing COM Components using VC-ATL(3-5) (轉)dev
- Developing COM Components using VC-ATL(3-4) (轉)dev
- Developing COM Components using VC-ATL(3-6) (轉)dev
- Developing COM Components using VC-ATL(3-7) (轉)dev
- Developing for ARKit 1.5 update using Unity ARKit PlugindevUnityPlugin
- [轉帖]10 Hardware Components of Oracle ExadataOracle
- Android Architecture Components Part1:RoomAndroidOOM
- Angular 2 Components CommunicateAngular
- 探索Web ComponentsWeb
- [譯] Architecture Components 之 Adding Components to your ProjectProject
- 從HTML Components的衰落看Web Components的危機HTMLWeb
- Web Components 小欖Web
- 「 重磅 」React Server ComponentsReactServer
- Styled-Components初探
- Web Components 原生元件 TrendsWeb元件
- 【譯】Web Components簡介Web
- Web Components系列(一) —— 概述Web
- Building Custom ComponentsUI
- astro中建立web componentsASTWeb
- SAP Commerce Cloud Build Manifest ComponentsCloudUI
- Flutter Flame 教程3 -- Components元件Flutter元件
- 初識 Web Components 與 StencilWeb
- 【譯】容器元件 (Container Components)元件AI
- Atag – Web Components 最佳實踐Web
- visual components premium特色功能REM
- Web Components之Custom ElementsWeb
- Altium designer 從原理圖更新至PCB時出現提示:failed to match * of * components using unique identifiersAIIDE
- XML 程式設計思想: UBL 1.0(以及 ebXML Core Components 等)(轉)XML程式設計
- Web Components 入門例項教程Web
- [譯] styled-components v3.1.0
- [譯] Web Components 的高階工具Web
- Visual Components軟體特點
- 淺析Web components的痛點Web
- Web Components 系列(五)—— 關於 TemplatesWeb
- Web Components 系列(五)—— 詳解 SlotsWeb