views:

962

answers:

3

I need to compile some code of mine using the gcc compiler included in the R tools (R the statistical program for windows), the problem is that I need to use IDispatch in my code to create an access the methods of a COM object, and the gcc compiler doesn't support much of the code that I'm using to do so, which is basically C++ code.

So my question is how can I use IDispatch in C to create the COM object without having to depend on MFC, .NET, C#, WTL, or ATL. I believe that if I do so I will be able to compile my code without any problem.

+1  A: 

In general, a C++ IDispatch interface is just a table of function pointers. In C, it would look something like:

typedef struct {
  HRESULT(*pQueryInterface)(void* this, REFIID riid, void **ppvObject);
  ULONG(*pAddRef)(void* this);
  ULONG(*pRelease)(void* this);
  HRESULT(*pGetTypeInfoCount)(void* this, unsigned int* pctInfo);
  HRESULT(*pGetTypeInfo)(void* this, unsigned int iTInfo,LCID lcid, ITypeInfo** ppTInfo);
  HRESULT(*pGetIDsOfNames)(void* this, REFIID riid, OLECHAR** rgszNames, unsigned int cNames, LCID lcid, DISPID* rgDispId);
 HRESULT(*pInvoke)(void* this, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, unsigned int* puArgErr);
} IDispatch_in_C;

Note that every method has a THIS pointer as the first parameter, and that you will need to define more types, such as ITypeInfo, REFIID, DISPID, etc, etc.

So, its a big task. But it is possible to create C++ interfaces in pure C.

abelenky
Note that you need to make sure your calling conventions match up otherwise your parameter passing order and stack cleanup will not work properly. Be sure that these methods are declared as using the 'stdcall' calling convention.
Adam Markowitz
+3  A: 

There is a great article on CodeProject entitled "COM in plain C".

Here is the link to Part 1.

There is a lot of very good info on working with COM in C in that article and the author's subsequent follow-ups (I think there are 3 or 4 in the series).

Edit:
I was wrong, there are 8 parts!

Part 2
Part 3
Part 4
Part 5
Part 6
Part 7
Part 8

unforgiven3
this is a very good tutorial indeed, I was looking at it, and the first part explains how to create a COM object, which I already have, the problem is that my COM object is written in C#, I saw in the tutorial that you need to create a include(.h) file in which you must specify the VTable's, GUIDs and structures in your COM object, now, can I do this even if my COM object is C#?
Vic
Hmm - I would imagine it is possible, do you register your C# COM object in the Registry? I think that's all that is necessary. COM is a binary standard, so the VTable should be the same regardless of whether it's implemented in C#, C++, VB, etc.
unforgiven3
+2  A: 

Also you can use disphelper library.

lazyden