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

类别:VC语言 点击:0 评论:0 推荐:

下面为客户测试端四个函数的完整代码。

// 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;

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

 

class CAboutDlg : public CDialog

{

public:

         CAboutDlg();

 

// Dialog Data

         //{{AFX_DATA(CAboutDlg)

         enum { IDD = IDD_ABOUTBOX };

         //}}AFX_DATA

 

         // ClassWizard generated virtual function overrides

         //{{AFX_VIRTUAL(CAboutDlg)

         protected:

         virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

         //}}AFX_VIRTUAL

 

// Implementation

protected:

         //{{AFX_MSG(CAboutDlg)

         //}}AFX_MSG

         DECLARE_MESSAGE_MAP()

};

 

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

         //{{AFX_DATA_INIT(CAboutDlg)

         //}}AFX_DATA_INIT

}

 

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

         CDialog::DoDataExchange(pDX);

         //{{AFX_DATA_MAP(CAboutDlg)

         //}}AFX_DATA_MAP

}

 

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

         //{{AFX_MSG_MAP(CAboutDlg)

                   // No message handlers

         //}}AFX_MSG_MAP

END_MESSAGE_MAP()

 

/////////////////////////////////////////////////////////////////////////////

// CMyExeDlg dialog

 

CMyExeDlg::CMyExeDlg(CWnd* pParent /*=NULL*/)

         : CDialog(CMyExeDlg::IDD, pParent)

{

         //{{AFX_DATA_INIT(CMyExeDlg)

                   // NOTE: the ClassWizard will add member initialization here

         //}}AFX_DATA_INIT

         // Note that LoadIcon does not require a subsequent DestroyIcon in Win32

         m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

 

void CMyExeDlg::DoDataExchange(CDataExchange* pDX)

{

         CDialog::DoDataExchange(pDX);

         //{{AFX_DATA_MAP(CMyExeDlg)

                   // NOTE: the ClassWizard will add DDX and DDV calls here

         //}}AFX_DATA_MAP

}

 

BEGIN_MESSAGE_MAP(CMyExeDlg, CDialog)

         //{{AFX_MSG_MAP(CMyExeDlg)

         ON_WM_SYSCOMMAND()

         ON_WM_PAINT()

         ON_WM_QUERYDRAGICON()

         ON_BN_CLICKED(IDC_BUTTON1, OnMyF1)

         ON_BN_CLICKED(IDC_BUTTON2, OnMyF2)

         ON_BN_CLICKED(IDC_BUTTON3, OnMyF3)

         ON_BN_CLICKED(IDC_BUTTON4, OnMyF4)

         //}}AFX_MSG_MAP

END_MESSAGE_MAP()

 

/////////////////////////////////////////////////////////////////////////////

// CMyExeDlg message handlers

 

BOOL CMyExeDlg::OnInitDialog()

{

         CDialog::OnInitDialog();

 

         // Add "About..." menu item to system menu.

 

         // IDM_ABOUTBOX must be in the system command range.

         ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

         ASSERT(IDM_ABOUTBOX < 0xF000);

 

         CMenu* pSysMenu = GetSystemMenu(FALSE);

         if (pSysMenu != NULL)

         {

                   CString strAboutMenu;

                   strAboutMenu.LoadString(IDS_ABOUTBOX);

                   if (!strAboutMenu.IsEmpty())

                   {

                            pSysMenu->AppendMenu(MF_SEPARATOR);

                            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

                   }

         }

 

         // Set the icon for this dialog.  The framework does this automatically

         //  when the application's main window is not a dialog

         SetIcon(m_hIcon, TRUE);                            // Set big icon

         SetIcon(m_hIcon, FALSE);                  // Set small icon

        

         // TODO: Add extra initialization here

        

         return TRUE;  // return TRUE  unless you set the focus to a control

}

 

void CMyExeDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

         if ((nID & 0xFFF0) == IDM_ABOUTBOX)

         {

                   CAboutDlg dlgAbout;

                   dlgAbout.DoModal();

         }

         else

         {

                   CDialog::OnSysCommand(nID, lParam);

         }

}

 

// If you add a minimize button to your dialog, you will need the code below

//  to draw the icon.  For MFC applications using the document/view model,

//  this is automatically done for you by the framework.

 

void CMyExeDlg::OnPaint()

{

         if (IsIconic())

         {

                   CPaintDC dc(this); // device context for painting

 

                   SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

 

                   // Center icon in client rectangle

                   int cxIcon = GetSystemMetrics(SM_CXICON);

                   int cyIcon = GetSystemMetrics(SM_CYICON);

                   CRect rect;

                   GetClientRect(&rect);

                   int x = (rect.Width() - cxIcon + 1) / 2;

                   int y = (rect.Height() - cyIcon + 1) / 2;

 

                   // Draw the icon

                   dc.DrawIcon(x, y, m_hIcon);

         }

         else

         {

                   CDialog::OnPaint();

         }

}

 

// The system calls this to obtain the cursor to display while the user drags

//  the minimized window.

HCURSOR CMyExeDlg::OnQueryDragIcon()

{

         return (HCURSOR) m_hIcon;

}

 

void CMyExeDlg::OnMyF1()

{

         // TODO: Add your control notification handler code here

         HRESULT hr=CoInitialize(NULL);

         CLSID  clsid;

         hr=CLSIDFromProgID(OLESTR("MyProj.MyCom"),&clsid);

         if(FAILED(hr))

         {

                   AfxMessageBox("COM Failed");

                   return;

         }

         IMyCom  *ptr = NULL;

         hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(IMyCom),(LPVOID*)&ptr);

         ptr->MyF1();

         ptr->Release(); // 释放实例

         CoUninitialize();

}

 

void CMyExeDlg::OnMyF2()

{

         // TODO: Add your control notification handler code here

         HRESULT hr=CoInitialize(NULL);

         CLSID  clsid;

         hr=CLSIDFromProgID(OLESTR("MyProj.MyCom"),&clsid);

         if(FAILED(hr))

         {

                   AfxMessageBox("COM Failed");

                   return;

         }

         IMyCom  *ptr = NULL;

         hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(IMyCom),(LPVOID*)&ptr);

         char str[32];

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

         AfxMessageBox(str);

         ptr->Release();// 释放实例

         CoUninitialize();

}

 

void CMyExeDlg::OnMyF3()

{

         // TODO: Add your control notification handler code here

         HRESULT hr=CoInitialize(NULL);

         CLSID  clsid;

         hr=CLSIDFromProgID(OLESTR("MyProj.MyCom"),&clsid);

         if(FAILED(hr))

         {

                   AfxMessageBox("COM Failed");

                   return;

         }

         IMyCom  *ptr = NULL;

         hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(IMyCom),(LPVOID*)&ptr);

         AfxMessageBox(ptr->MyF3("abcdefg"));

         ptr->Release(); // 释放实例

         CoUninitialize();

}

 

void CMyExeDlg::OnMyF4()

{

         // TODO: Add your control notification handler code here

         HRESULT hr=CoInitialize(NULL);

         CLSID  clsid;

         hr=CLSIDFromProgID(OLESTR("MyProj.MyCom"),&clsid);

         if(FAILED(hr))

         {

                   AfxMessageBox("COM Failed");

                   return;

         }

         IMyCom  *ptr = NULL;

         hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(IMyCom),(LPVOID*)&ptr);

         int x=8; char str[32];

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

         AfxMessageBox(str);

         ptr->Release();// 释放实例

         CoUninitialize();

}

 

 

通过这个简单的例子,我们做了最简单的COM组件,及测试组件的客户端,在这里只是教大家如何用VC ATL做COM组件,在接下来这一篇里Developing COM Components using VC-ATL(2)将对COM的基本原理进行介绍,以及对这一例子的源代码进行剖析。

 

Developing COM Components using VC-ATL(1)完

本文地址:http://com.8s8s.com/it/it1333.htm