That is true partially.
In .NET , Crystal Reports is the standard and it is integrated as a control in the ToolBox.
The CR is working very well with Visual C++ before .NET working in .NET and Java.
There are many ways to use it is C++.
One way is to design your reports using CR standalone and store the reports in .rpt files.
An .rpt file encapsulates everything about report: layout, database, database connection, SQL queries etc...
At run time in your C++ application , only you have to use CR API functions to execute the .rpt files which means: connect with database, generate the report in the background if you want and print it also in background or view it.
CString csPathToRPT = "myreport.rpt";
typedef UINT (CALLBACK* LPFNPEOpenEngine)();
typedef UINT (CALLBACK* LPFNPEOpenPrintJob)(char *reportFilePath);
//
LPFNPEOpenEngine lpfnPEOpenEngine;
LPFNPEOpenPrintJob lpfnPEOpenPrintJob;
LPFNPECloseEngine lpfnPECloseEngine;
HINSTANCE hDLL = (HINSTANCE)::LoadLibrary( "CRPE32.DLL" );
if ( (UINT)hDLL >= (UINT)HINSTANCE_ERROR )
{
lpfnPEOpenEngine = (LPFNPEOpenEngine)GetProcAddress(hDLL, "PEOpenEngine"

;
if ( lpfnPEOpenEngine() )
{
// Print or view the report
lpfnPEOpenPrintJob = (LPFNPEOpenPrintJob)GetProcAddress(hDLL, "PEOpenPrintJob"

;
Job = lpfnPEOpenPrintJob((char *)LPCTSTR(csPathToRPT));
}
}
and so on.
-obislavu-