65.9K
CodeProject is changing. Read more.
Home

Calling COM DLLs from Console Applications

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.09/5 (8 votes)

Apr 24, 2002

CPOL
viewsIcon

97041

downloadIcon

998

This Article explains how to call a COM DLL from a Console Application

Introduction

This article shows how to call a VC++ DLL from a Console Application in C.

Getting Started

  • Create a new ATL project for a DLL , Click Finish.
  • Use ATL Object Wizard to add a simple object, Short Name as mydll , accept defaults.
  • Using Class View Add Method to the new interface , Method Name as multiply and parameters as '[in] int ifirst,[in] int isecond,[out] int* result'.

Your method should look like this:

STDMETHODIMP Cmydll::multiply(int ifirst, int isecond, int *result)
{
  // TODO: Add your implementation code here
  *result = ifirst * isecond;

  return S_OK;
}

Build and register the DLL. Now Create a Win32 Console Application named 'CallCDLL'.

Includes

#include <stdio.h>
#include <objbase.h>
#include "dll4C.h" //contains prototype of method
#include "dll4C_i.c" //contains the Class ID ( CLSID ) 
//and Interface ID ( IID )

Your Main() should like this
int main(void)
{
  IClassFactory* pclsf;
  IUnknown* pUnk;
  Imydll* pmydll;
  int x,y;
  int result;
  
  //Initialize the OLE libraries
  CoInitialize(NULL);

  //get the IClassFactory Interface pointer
  HRESULT hr = CoGetClassObject(CLSID_mydll,CLSCTX_INPROC,NULL,
    IID_IClassFactory,(void**)&pclsf);

  if(!SUCCEEDED(hr))
  {
    printf("CoGetClassObject failed with error %x\n",hr);
    return 1;
  }

  //Use IClassFactory's CreateInstance to create the COM object
  //and get the IUnknown interface pointer
  hr = pclsf->CreateInstance(NULL,IID_IUnknown,(void**)&pUnk);

  if(!SUCCEEDED(hr))
  {
    printf("ClassFactory CreateInstance failed with error %x\n",hr);
    return 1;
  }

  //Query the IUnknown to get to the Imydll interface
  hr = pUnk->QueryInterface(IID_Imydll,(void**)&pmydll);

  if(!SUCCEEDED(hr))
  {
    printf("QueryInterface failed with error %x\n",hr);
    return 1;
  }

  //Use Imydll interface for multiplications
  printf("Input two numbers to multiply:\n");
  scanf("%d\n%d",&x,&y);
  pmydll->multiply(x,y,&result);//call the method using 
                         //the interface pointer

  printf("The product of the two numbers %d and %d = %d\n",
    x,y,result);//print the result

  //Release the interface pointers
  pmydll->Release();
  pclsf->Release();

  return 0;
}


Conclusion

That's it. Write to me for any explanations/suggestions.