Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Hello World in COM using ATL

0.00/5 (No votes)
21 Apr 2004 1  
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