The return value is not a boolean, but a pointer to the interpolated curve.
You basically have 2 options: 1) give a pointer to a curve, this will then be returned if successful. Or 2) do not give a pointer to a curve, a new curve will be allocated and returned if successful. You are then responsible to free its memory if you are finished with it.
Option 1 (I personally prefer this, no need to deallocate the result):
ON_NurbsCurve result;
if (RhinoInterpCurve(pnts, NULL, NULL, knotStyle, &result) && result.IsValid())
{
// yay, your interpolated curve is ready to use
}
Option 2:
ON_NurbsCurve* result = RhinoInterpCurve(pnts, NULL, NULL, knotStyle, NULL);
if (result)
{
if (result->IsValid())
{
// yay, your interpolated curve is ready to use
}
delete result;
}