Click here to Skip to main content
Click here to Skip to main content

Hello World in COM using ATL

, 21 Apr 2004
Rate this:
Please Sign up or sign in to vote.
The objective of this tutorial is to demonstrate how to build a COM Server and an MFC Client using Visual C++ 6.0. We are going to develop a COM server that takes in a string as input parameter and returns the string prefixed with a "Hello".

Sample Image

Introduction

The objective of this tutorial is to demonstrate how to build a COM Server and an MFC Client using Visual C++ 6.0. We are going to develop a COM server that takes in a string as input parameter and returns the string prefixed with a "Hello".

Prerequisite

You will need to have worked in Windows before to understand the terminology like dialogs, buttons, edit boxes. Having worked in Visual C++ before would be an added advantage.

Creating the COM server

  1. Choose ATL COM app wizard and type in the Project name. In this case it is sample1
  2. Next choose server type as dynamic link library and click on finish.
  3. Click okay to get Class wizard to generate the files.
  4. Go to the class view, right click on “sample1 classes” and choose “New ATL object”.
  5. Now choose simple object.
  6. Type in the short name for the component, in this case CGreet, the wizard automatically fills in the rest of the names.
  7. Go to the class view again
  8. Right click on the spoon shaped icon saying ICGreet and choose “Add Method”
  9. Type in the name of the function as SayHello and fill in the parameters as [in] BSTR name, [out,retval] BSTR *retstr
  10. Now go to file view and type in the following code into CGreet.cpp as shown below
Compile the application and your server is ready
//{-----------code added by imran on 18 sept 2k-----------------------
// CCGreet
STDMETHODIMP CCGreet::SayHello(BSTR name, BSTR *retstr)

{
// This method's signature is
//SayHello([in] BSTR name, [out,retval] BSTR *retstr) 

     char str[20] ;
     sprintf(str,"hello "); 
              // copy the value of hello into the string variable

   //create a new variable called temp initialized with the value of str
     CComBSTR temp(str);

   //append the input parameter value to the temp variable
    temp += name ;
               
   //send the value back to the calling function
   *retstr = temp.Detach();
 
   return S_OK;

}
//-----------code added by imran on 18 sept 2k---------------------------}

Creating the COM Client

Here we create a COM client for the above COM server DLL. This is a MFC dialog based application with a edit box and two buttons.
  1. Select New MFC AppWizard from the project menu and type in the project name mfcclient in this case
  2. Choose Dialog based application and click Finish
  3. You would now be looking at the application in the resource view. Add an edit box to the application by selecting the edit box, next click on the dialog box and drag.
  4. Also create a CString (value) variable associated with it, call this variable m_edit – press CTRL and W to bring up the class wizard. Choose the member variables tab and choose IDC_EDIT1 and click on “Add Variable”, type in the name.
  5. Now a file called mfcclientdlg.cpp would have been generated .
  6. Double click the “Ok” button on the dialog, the wizard pops up a box asking a name for the function, choose the default name “OnOk” to go to the mfcclientdlg.cpp file
  7. Modify the file to look like the file below.
Run the application, enter a name in the text box and click the okay button, this will cause the contents of the edit box to change to the same text prefixed with a hello.
//
// mfcclientDlg.cpp : implementation file
//{----------------code added by imran -----------------
#include "..\sample1\sample1_i.c" // this is a server file
#include "..\sample1\sample1.h"  // this is a server file
//The above two server files should be included in the client header file

#include "Comdef.h"      //for usage of BSTR
#include "Atlbase.h"     // for usage of CComBSTR
//----------------code added by imran -----------------}

void CMfcclientDlg::OnOK()

{

//{-----------code added by imran on ---------------------------------- 
    HRESULT hr = CoInitialize(NULL); // Initialize COM library

    if (FAILED(hr)) //if initialization fails then exit

    {
         AfxMessageBox("Failed to initialize COM library");
    }


    //Get the below two constants from the servername_i.c
    const CLSID CLSID_CGreet = {0x242C8BCE,0x8D72,0x11D4,
                                {0xAC,0x91,0x00,0xB0,0xD0,0x69,0x54,0x6F}};
    const IID IID_ICGreet = {0x242C8BCD,0x8D72,0x11D4,
                             {0xAC,0x91,0x00,0xB0,0xD0,0x69,0x54,0x6F}};


    char mname[20];
    CString cResult;

    // sprintf(mname,"Imran"); <- can be used to write 
    // a string to a char array

    // ICGreet is the name of the interface in the CGreet 
    // class (which is the server)
    // pointer to the interface

    ICGreet *ptrICGreet = NULL;

    //create the com
    hr = CoCreateInstance(CLSID_CGreet, NULL, 
                          CLSCTX_INPROC_SERVER,IID_ICGreet,
                          (LPVOID*) &ptrICGreet);

    if (SUCCEEDED(hr))
    {
         CComBSTR mresult;

         //get the name typed into the edit box and
         //copy it into the char array 
    // called mname
         GetDlgItemText(IDC_EDIT1,mname,20);

         //typecast the char to a bstr before it is passed to the COM
         _bstr_t bstresult(mname);

         //finally... call the COM function via the interface pointer
         ptrICGreet->SayHello(bstresult,&mresult);

         //method signature is SayHello([in] BSTR name, 
         //[out,retval] BSTR *retstr)
         //copy the result into a CString so that
         //it can be displayed in a message box

         cResult = mresult;
         MessageBox(cResult);

         //copy the result into a CString value variable 
         //associated with the edit box

         m_edit = mresult;

         //update the display on the screen
         UpdateData(FALSE);

         //free the COM pointer...
         ptrICGreet->Release();
    }

    //MessageBox(mname);

    CoUninitialize();

//-----------code added by imran on 18 sept 2k---------------------------}

    // CDialog::OnOK();

}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Imran Ebrahim
Product Manager
India India
Imran is a software professional with 9 years of development experience and has worked on JAVA, VB6, VC6, C# & some JavaScript.
 
He is interested in Hi-Performance code, OO Methodology, OS API's, Optimizing Windows, Tweaking IE.
 
For the last few years Imran has specialized in developing robust, hi-performance applications & GUI's (Swing) for MNC's.
 
http://techspot121.blogspot.com/

Comments and Discussions

 
GeneralGood Article PinmemberNitin_an18-Aug-08 23:21 
Generaluhmm Pinmemberdrprestin12-Nov-07 13:24 
GeneralRe: uhmm Pinmemberdrprestin12-Nov-07 14:03 
GeneralRe: uhmm Pinmemberdrprestin12-Nov-07 14:07 
GeneralDLL TO EXE Pinmemberdrprestin13-Nov-07 9:53 
GeneralRe: uhmm Pinmemberdrprestin15-Nov-07 7:52 
Generalnice but having a problem Pinmemberchetanprakash7-Nov-05 0:37 
GeneralRe: nice but having a problem Pinmembercoldsun5-Mar-07 21:26 
GeneralTo author Pinmemberdaniel23-Jan-08 19:02 
GeneralRe: To author Pinmemberraja_sharma_anubhav5-Feb-09 2:11 
QuestionWHAT UP PinmemberShamanYoung15-Jun-05 16:25 
Answerhave soluted! PinmemberShamanYoung15-Jun-05 17:04 
GeneralA general COM question PinmembercomServ12326-Oct-04 5:42 
GeneralClass not registered Pinmemberact_x19-Oct-04 12:22 
Generalclassid Pinmemberpurusingh8-Aug-04 20:28 
GeneralMatlab COM Pinmemberdnqhung20-May-04 18:33 
GeneralRe: Matlab COM Pinmembercarinbahar17-Aug-05 2:22 
GeneralUse MFC Dll with Visual Studio 2003 Pinmembercreeder02-May-04 23:37 
GeneralPlug-in for MS Outlook PinmemberAtif Bashir30-Jul-03 16:33 
Generalsprintf PinmemberMoMad24-Oct-02 7:28 
GeneralRe: sprintf PinsussLe Viet Linh31-Jul-03 18:40 
GeneralRe: sprintf Pinmemberw_o_l_f_e17-Apr-04 22:22 
GeneralRe: sprintf PinmemberJubjub22-Apr-04 16:18 
GeneralRe: sprintf Pinmembercisla@cisaplicaciones.net9-Jun-05 6:38 
GeneralRe: sprintf PinmemberJubjub9-Jun-05 12:06 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web01 | 2.8.141029.1 | Last Updated 22 Apr 2004
Article Copyright 2002 by Imran Ebrahim
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid