First, COM is like black magic for me. But I need to use COM dll in one project I'm working on.
So, I have a DLL I am developing and I need some functionalities that are available in a separate COM DLL. When I look to the COM DLL with Depends.exe I see methods like DllGetClassObject() and other functions but none of the functions I'm interested in.
I have access to the COM DLL (legacy) source code but it's a mess and I'd rather like to use the COM DLL in binary like a big black box not knowing what's going on inside.
So, how can I call the COM DLL functions from my code using LoadLibrary? Is it possible? If, yes, could you give me an example of how to do it?
I'm using Visual Studio 6 for this project.
Thanks a lot!
In general, you should prefer CoCreateInstance
or CoGetClassObject
rather than accessing DllGetClassObject
directly. But if you're dealing with a DLL that you can't, or don't want to, register, then the below describes (part of) what these function do behind the scenes.
Given a CLSID, DllGetClassObject
allows you to get the class object, from which you can create instances (via the IClassFactory
interface, if I remember correctly).
Summary of steps (it's been a while since I've last touched COM, so pardon any obvious errors):
DllGetClassObject(clsid, IID_IClassFactory, &cf)
, where clsid
is the CLSID you want to get the class object for, and cf
is of course the class factory.cf->CreateInstance(0, iid, &obj)
, where iid
is the IID of the interface you'd like to use, and obj
is of course the object.(CoCreateInstance
performs steps 1 and 2. CoGetClassObject
performs step 1. You would use CoGetClassObject
if you need to create many instances of the same class, so that step 1 doesn't need to be repeated each time.)