Although C++ is the most commonly used language for COM programming, you can also access COM objects using C. Doing so is relatively straightforward, but requires a somewhat more complex syntax:
Every COM object has a vtable that contains a list of pointers to the methods that the object exposes. An interface pointer points to the appropriate location in the vtable, which in turn contains a pointer to the particular method you are calling. The vtable is not mentioned elsewhere in this documentation because the vtable is essentially invisible with C++. However, if you want to call COM methods with C, you must include an additional level of indirection that explicitly references the vtable.
Some components have macros defined in their header files that resolve to the correct calling convention. See Using Macros to Call DirectX COM Methods for details.