procedure OpenStream(var vVideoPort: OleVariant; var vPciPort: OleVariant; bMinimized: Integer; 
                         var nRetVal: SYSINT); safecall;
是引入的一个COM接口下的方法。
参数vVideoPort应该传一个record的的值。该Record的定义如下。VRECT = packed record
    nStartX: Integer;
    nStartY: Integer;
    nWidth: Integer;
    nHeight: Integer;
  end;VelaPciPort = packed record
    nFormat: VideoFormat;
    nStreamType: VideoType;
    nPitch: SYSINT;    //integer
    bVanityMode: Integer;
    bUseMMU: Integer;
    dwAddr: Integer;
    nStreamRate: SYSINT;
    pReserved0: Integer;
    pReserved1: Integer;
    VRECT: VRECT;
  end;VelaVideoPort = packed record
    nPort: VideoPort;
    nFrameRate: SYSINT;
    FieldCtl: VelaFieldCtl;
    VAcqRect: VRECT;
  end;下面是我的调用代码
var
  tempVideoPort:VelaVideoPort;
  tempPciPort:VelaPciPort;
begin
  ...//初始化tempPort,tempPciPort;;
  Self.m_CVProServer.OpenStream(tempVideoPort,tempPciPort,0,nRetVal);
  //但是编译报错。错误提示是Invalid typecast.
  //到底怎么才能把一个Record传进去??
end;

解决方案 »

  1.   

    用VarArrayCreate来把记录编组传递过去.....type
      TTest = packed record
        a, b, c, d: Integer;
        e, f: array[0..127] of Char;
      end;procedure Example;
    var
      test: TTest;
      p: Integer;
      v: Variant;
    begin
      //为test填值
      //...
      //...  // 将test中的内容传给v
      v := VarArrayCreate([0,sizeof(test)-1], varByte);
      p := VarArrayLock(v);
      try
        Move(test, p^, sizeof(test));
      finally
        VarArrayUnlock(v);
      end;  // 调用接口方法
      MyInterfaceObject.MyMethod(v);
    end;