Click here to Skip to main content
12,896,953 members (53,881 online)
Click here to Skip to main content
Add your own
alternative version


59 bookmarked
Posted 16 Apr 2007

Emulating CoCreateInstance()

, 16 Apr 2007
Rate this:
Please Sign up or sign in to vote.
Describes how to use COM objects without registration.


A while ago, I wrote a small utility that converts DOT syntax into an image using the WinGraphViz.DLL COM component.

However, it is not very usual to have the user register this component before running the tool, thus I started looking around for a way to use COM components as if they were normal DLLs. The research yielded that there are many techniques to accomplish that:

  1. Registration-Free COM (for XP and above)
  2. Emulating the CoCreateInstance()

To learn more about Registration-Free COM, please check the references at the end of this article.

Emulating CoCreateInstance()

Normally, to create an instance, you would do something like:

hr = CoCreateInstance(CLSID_DOT, NULL, CLSCTX_ALL,
                      IID_IDOT, (LPVOID *)&pIDOT);

This will cause OLE to fetch the associated DLL from the registry and call its DllGetClassObject() method to get a class factory, then from the class factory an instance of your required IID will be created.

For that reason, we may emulate the CoCreateInstance() by the following code:

HRESULT __stdcall MyCoCreateInstance(
  LPCTSTR szDllName,
  IN REFCLSID rclsid,
  IUnknown* pUnkOuter,
  IN REFIID riid,

  HMODULE hDll = ::LoadLibrary(szDllName);
  if (hDll == 0)
    return hr;

  typedef HRESULT (__stdcall *pDllGetClassObject)(IN REFCLSID rclsid, 
                   IN REFIID riid, OUT LPVOID FAR* ppv);

  pDllGetClassObject GetClassObject = 
     (pDllGetClassObject)::GetProcAddress(hDll, "DllGetClassObject");
  if (GetClassObject == 0)
    return hr;

  IClassFactory *pIFactory;

  hr = GetClassObject(rclsid, IID_IClassFactory, (LPVOID *)&pIFactory);

  if (!SUCCEEDED(hr))
    return hr;

  hr = pIFactory->CreateInstance(pUnkOuter, riid, ppv);

  return hr;

Notice how this function takes a parameter holding the DLL's name.

Using the code

You need your application to run first if the COM is registered, if not you would resort to emulating the CoCreateInstance(). Your code could look like this:

hr = CoCreateInstance(CLSID_DOT, NULL, CLSCTX_ALL,

  hr = MyCoCreateInstance(_T("WinGraphViz.dll"), CLSID_DOT, 

if (FAILED(hr))
  cout << "CoCreateInstance Failed: " << hr 
       << "nn";
  return -1;


The following links were helpful during the building of this simple snippet:


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


About the Author

Elias Bachaalany
Web Developer
United States United States
Elias (aka lallousx86, @0xeb) has always been interested in the making of things and their inner workings.

His computer interests include system programming, reverse engineering, writing libraries, tutorials and articles.

In his free time, and apart from researching, his favorite reading topics include: dreams, metaphysics, philosophy, psychology and any other human/mystical science.

Former employee of Hex-Rays (the creators of IDA Pro), was responsible about many debugger plugins, IDAPython project ownership and what not.

Elias currently works at Microsoft as a software security engineer.

More articles and blog posts can be found here:


You may also be interested in...

Comments and Discussions

QuestionWhat about IDispatch methods? Pin
mertart12-Jun-10 2:50
membermertart12-Jun-10 2:50 
QuestionSingle Instance of COM Servers from different clients Pin
GurmeetSingh8718-Feb-10 6:00
memberGurmeetSingh8718-Feb-10 6:00 
GeneralCool, Great, Successfully used on Linux!!! Pin
Sharjith20-Jul-09 5:46
memberSharjith20-Jul-09 5:46 
QuestionHow do I get clsid/iid unless the COM dll is not registered Pin
ehaerim23-Dec-07 18:50
memberehaerim23-Dec-07 18:50 
AnswerRe: How do I get clsid/iid unless the COM dll is not registered Pin
Sharjith21-Jul-09 6:50
memberSharjith21-Jul-09 6:50 
That is what the author has done! You give the dll name (absolute path) or filename only if dll is in path, as first argument to MyCoCreateInstance. That's what CoCreateInstance also does, but way round by searching the ClassID and getting the corresponding dll from the registered path in the registry and then open it and fetch the object by calling DllGetClassObject from the dll. The author has simply removed the registry from the picture.

If it is a 3rd party dll, you can refer to the documentation to know the Interfaces supported and the CoClasses. Then as a rule of thumb you can use IID_ prefixed for Interfaces and CLSID_ prefixed with class names.

However MyCoCreateInstance has helped me port some COM stuff to Linux by replacing LoadLibrary, GetProcAddress, FreeLibrary and GetLastError with dlopen, dlsym, dlclose and dlerror respectively. Wink | ;)

Hope this helpsThumbs Up | :thumbsup:

RegardsSmile | :)
N. Sharjith

Questionun freed addtional dlls Pin
irol9-Nov-07 4:46
memberirol9-Nov-07 4:46 
AnswerRe: un freed addtional dlls Pin
lallous11-Nov-07 22:19
memberlallous11-Nov-07 22:19 
GeneralRe: un freed addtional dlls Pin
irol12-Nov-07 23:57
memberirol12-Nov-07 23:57 
QuestionOCX? Pin
sammytheblowfish10-Jul-07 20:28
membersammytheblowfish10-Jul-07 20:28 
QuestionRe: OCX? Pin
sammytheblowfish14-Jul-07 12:18
membersammytheblowfish14-Jul-07 12:18 
AnswerRe: OCX? Pin
charlieqin8-Nov-07 6:54
membercharlieqin8-Nov-07 6:54 
QuestionFreeLibrary? Pin
pestking17-Apr-07 15:03
memberpestking17-Apr-07 15:03 
AnswerRe: FreeLibrary? Pin
lallous17-Apr-07 18:49
memberlallous17-Apr-07 18:49 
GeneralRe: FreeLibrary? Pin
Phish Bulb13-Sep-07 5:27
memberPhish Bulb13-Sep-07 5:27 
GeneralRe: FreeLibrary? Pin
lallous20-Sep-07 21:01
memberlallous20-Sep-07 21:01 
GeneralGood stuff Pin
sprymak16-Apr-07 23:13
membersprymak16-Apr-07 23:13 

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.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.170424.1 | Last Updated 17 Apr 2007
Article Copyright 2007 by Elias Bachaalany
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid