I'm aware that there's no actually built-in concepts of interfaces in C
, so in order to implement it one must use abstract classes which only contains pure virtual functions.
Now, In Microsoft Windows' API list, some of the classes there like
Thinking that I need to sub-class the Interfaces, I tried the following code below but it seems that I'm wrong about the sub-classing:
#include <iostream>
#include <propidl.h>
#include <objidl.h>
class PropertyStorage : IPropertyStorage {};
int main(int argc, char* argv[]){
PropertyStorage ips(); <- function returning abstract class "PropertyStorage" is not allowed
}
Having said those things, I'd like to reiterate
My question is: How do you actually use the interfaces from Microsoft Windows' API?
CodePudding user response:
How do you actually use the interfaces from Microsoft Windows' API?
That's easy: You acquire a pointer to an interface, and start using it. And when done, you Release()
it. That's COM in a nutshell.
On to the harder question then: How do you actually get hold of a COM interface pointer? Essentially, there are two ways to do so:
Call a factory function that supplies a COM object through an interface pointer. The "standard" way is by calling
CoCreateInstance
. The less "standard" (albeit increasingly common) way is to call a dedicated factory function. To get anIPropertyStorage
interface you can callStgCreatePropStg
(or similar), for example.This addresses the use case where you are consuming a COM interface that the system (or a library) provides for client use.
Implement the interface, and use whatever means you see fit to instantiate this concrete implementation. When using a COM-capable C compiler (such as MSVC) this amounts to providing an implementation for a class that derives from the interface.
This is useful for cases where you need to author an interface, generally to be consumed by someone else. Examples include
IStream
orIEnumString
. This is not the case for the interfaces asked for in the question.