Click here to Skip to main content
15,881,715 members
Articles / Desktop Programming / ATL

Calling COM DLLs from Console Applications

Rate me:
Please Sign up or sign in to vote.
3.09/5 (8 votes)
24 Apr 2002CPOL 96.3K   998   20   10
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.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



Comments and Discussions

 
GeneralNice for beginner.. Pin
yogeshratna27-Mar-10 4:53
yogeshratna27-Mar-10 4:53 
Generalwrong multiply result Pin
fatal00531-May-06 4:03
fatal00531-May-06 4:03 
GeneralCreateInstance fail Error Pin
amitsax7627-Feb-06 0:06
amitsax7627-Feb-06 0:06 
Generalif we call from asp Pin
uno20037-Oct-03 22:29
uno20037-Oct-03 22:29 
GeneralA simpler way Pin
Serge Weinstock24-Apr-02 21:40
Serge Weinstock24-Apr-02 21:40 
GeneralRe: A simpler way Pin
User 2898324-Apr-02 22:49
User 2898324-Apr-02 22:49 
GeneralUse smart pointer in the client Pin
Dudi Avramov24-Apr-02 21:12
Dudi Avramov24-Apr-02 21:12 
GeneralRe: Use smart pointer in the client Pin
User 2898324-Apr-02 22:48
User 2898324-Apr-02 22:48 
QuestionWhy use ClassFactory? Pin
23-Apr-02 22:35
suss23-Apr-02 22:35 
AnswerRe: Why use ClassFactory? Pin
User 2898323-Apr-02 23:32
User 2898323-Apr-02 23:32 

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

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