Figure 1: A sample IDL file
import "oaidl.idl"; //necessary includes for COM import "ocidl.idl"; [ object, //denotes ORPC, always include this tag uuid(638094E5-758F-11d1-8366-0000E83B6EF3), // GUID for this // interface dual, // support both IDispatch and Early Binding oleautomation, // see sidebar "proxy DLL's" helpstring("ICalc Interface"), // user friendly help pointer_default(unique) // tells RPC how to chase down // pointer, almost always // include this ] interface ICalc : IDispatch // Inheriting from IDispatch means it will support and early late // binding. Inheriting from IUnknown means it will only support // early binding { // below: your methods. [in] denotes an in only parameter, [out] // means you will be passing by reference. [out, retval] means // that you want the #import generated proxy class for this // interface to have the method in the form result=Add(1,2) as // opposed to Add(1,2, &result). Except for dispinterfaces (not // discussed here) all interface methods in COM must return an // HRESULT for error handling. This is why the [out, retval] tag // is necessary. [id(1), helpstring("method Add")] HRESULT Add([in] int x, [in] int y, [out,retval] int * r ); [id(2), helpstring("method Divide")] HRESULT Divide([in] int x, [in] int y, [out,retval] int * r); }; [ uuid(638094E1-758F-11d1-8366-0000E83B6EF3), // GUID for the // type library version(1.0), // version of the server/type library helpstring("calcsdk 1.0 Type Library") ] library COMCALCLib { importlib("stdole32.tlb"); // necessary includes importlib("stdole2.tlb"); [ uuid(638094E0-758F-11d1-8366-0000E83B6EF3), // GUID of // the COM // Class helpstring("Calc Class") ] // Below: This is the declaration of you COM class. This is what // you actually instantiate and use. A COM Server's IDL file may // have as many CoClasses as it likes. You must declare all the // interfaces you wish your class to support in the CoClass // block. Notice that it is always enclosed in the type library // block. coclass COMCalc { [default] interface ICalc; //other interface declarations if desired }; }; //NOTE: VC++ ATL projects will generate and maintain IDL files for //you to a large degree via wizards.