Hello World in COM using ATL






4.41/5 (27 votes)
Jul 9, 2002
2 min read

200759

4726
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".
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
- Choose ATL COM app wizard and type in the Project name. In this case it is
sample1
- Next choose server type as dynamic link library and click on finish.
- Click okay to get Class wizard to generate the files.
- Go to the class view, right click on
“sample1 classes”
and choose“New ATL object”.
- Now choose simple object.
- Type in the short name for the component, in this case
CGreet
, the wizard automatically fills in the rest of the names. - Go to the class view again
- Right click on the spoon shaped icon saying
ICGreet
and choose“Add Method”
- Type in the name of the function as
SayHello
and fill in the parameters as[in] BSTR name, [out,retval] BSTR *retstr
- Now go to file view and type in the following code into
CGreet.cpp
as shown below
//{-----------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.- Select
New MFC AppWizard
from the project menu and type in the project namemfcclient
in this case - Choose
Dialog based application
and click Finish - 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. - 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 chooseIDC_EDIT1
and click on “Add Variable”, type in the name. - Now a file called
mfcclientdlg.cpp
would have been generated . - 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 - Modify the file to look like the file below.
// // 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(); }