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.