anchor.diff:        return const TypeTuple('Pointer', 'Pointer');
       }
   
  -    final nativeType = 'Pointer<${projection.nativeType}>';
  -    final dartType = 'Pointer<${projection.nativeType}>';
  +    final nativeType = 'Pointer<$typeArgNativeType>';
  +    final dartType = 'Pointer<$typeArgNativeType>';
   
       return TypeTuple(nativeType, dartType);
     }
  
positive.code:       return unwrapCallbackType();
      }
  
      if (isInterface || typeIdentifier.baseType == BaseType.Object) {
        return const TypeTuple('Pointer<COMObject>', 'Pointer<COMObject>');
      }
  
  
negative.code:       throw Exception('Pointer type missing for $typeIdentifier.');
      }
      final typeArg = TypeProjection(typeIdentifier.typeArg!);
      // Strip leading underscores (unless the type is nested, in which
      // case leave one behind).
      final typeArgNativeType = typeIdentifier.typeArg?.type?.isNested == true
          ? '_${stripLeadingUnderscores(typeArg.projection.nativeType)}'
          : stripLeadingUnderscores(typeArg.projection.nativeType);
  
      // Pointer<Void> in Dart is unnecessarily restrictive, versus the
      // Win32 meaning, which is more like "undefined type". We can
  