type
  TProduct = class(TAutoObject, IProduct)
  public
    function  GetProductInfo(vFieldName: enmProductInfoField): WideString; stdcall;
    procedure LetProductInfo(vFieldName: enmProductInfoField;
      vNewValue: OleVariant); safecall;
    { Protected declarations }  end;
  TProductItem=class(TCollectionItem)
  public
     InnerProduct:TProduct;
  end;
  ......
  
  type  TProductsCol=class(TCollection)
  public
    //procedure Added(var Item: TCollectionItem); override;deprecated;
  end;  TProducts = class(TAutoObject, IProducts)
  protected
    function Count: Integer; stdcall;
    function  Item(Index: OleVariant): IProduct; safecall;
    procedure AddParameter(vFieldName: enmProductField;
      const vNewStr: WideString; And_Or: enmAnd_Or); safecall;
    procedure ExecuteQuery; safecall;
    { Protected declarations }
  private
    ProductsCol:TProductsCol;
    sPrm:string;
  public
    procedure Initialize;override;
  end;
 
以上是COM接口的实现,其中有一个方法:Item(Index):IProduct; 我是这样作的: function TProducts.Item(Index: OleVariant): IProduct; begin
     Result:=TProductItem(ProductsCol.FindItemID(intege(index))).InnerProduct ;
 end;编译通过了,可在其他开发环境(如VB)中使用这个方法时出现"内存不能为写"的错误.
为什么呢?
应该怎样从一个COM方法中返回一个COM接口?