See the question and my original answer on StackOverflow

You were very close, but CRPtr is a COM interface reference (=pointer) so it must be declared like this:

ICapsCrystalReportPtr CRPtr(__uuidof(CapsCrystalReport));

The IxxxPtr class was generated for you by #import in a .tlh file. What you can do when you have issues with #import, is just open the generated .tlh file and look at it.

Note you don't have to declare a default interface in C#, you can just declare the class like this:

[ComVisible(true)]
[Guid("89402DE5-BA26-4AC0-AB40-00ADD2876FF4")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ProgId("CAPSCrystalReport.Report")]
public class CapsCrystalReport
{
    ... same ...
}

And in C++, you would have to adapt your imports like this:

#import "C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\mscorlib.tlb" auto_rename
#import "W:\\CAPS Builds\\trunk\\CapsCrystalReportLib\\bin\\Debug\\CapsCrystalReportLib.tlb" no_namespace

and you would use it like that (the interface was implicitely created by .NET and wrapped by the #import):

_CapsCrystalReportPtr CRPtr(__uuidof(CapsCrystalReport));

PS: I would recommend you to keep the namespace, avoid no_namespace because it can cause problems with collisions especially in C++.