首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Delphi中访问包含VT_RECORD的VT_ARRAY的OleVariant

在Delphi中访问包含VT_RECORD的VT_ARRAY的OleVariant
EN

Stack Overflow用户
提问于 2013-04-30 18:05:15
回答 2查看 952关注 0票数 2

使用Delphi,我需要访问一个数组中包含一个或多个记录的OleVariant。

我调用的方法返回一个VT_RECORD的VT_ARRAY,记录本身定义如下:

代码语言:javascript
复制
struct StreamTimeInfo {
  unsigned int PID;
  LONGLONG PTS;
  LONGLONG TimeStamp;
}; 

我的代码是这样的:

代码语言:javascript
复制
procedure Test;
type
  TStreamInfo = record
    PID: Cardinal;
    PTS: Int64;
    TimeStamp: Int64;  
  end;
var
  Value: OleVariant
  StreamTime: TStreamInfo;
begin
  GetValue(Value); // Value holds a VT_ARRAY of VT_RECORD

  // How should I access the array of records in Delphi?
  // I've tried this to get to the first element:
  StreamTime := TStreamInfo(TVarData(Value).VPointer^);
end;

我不知道如何从Delphi访问这些记录。

我们非常感谢您的任何意见。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-30 18:26:09

我以前从未这样做过,但我认为这应该行得通。

代码语言:javascript
复制
type 
  TStreamInfoArray = array [0..MaxArrayCount-1] of TStreamInfo; 
  PStreamInfoArray = ^TStreamInfoArray; 
var 
  Value: Variant;
  p: PStreamInfoArray;
  StreamInfo: TStreamInfo;
begin 
  GetValue(Value);
  p := PStreamInfoArray(VarArrayLock(Value)); 
  try
    StreamInfo := p^[Index]; 
  finally
    VarArrayUnlock(Value); 
  end;
end; 
票数 3
EN

Stack Overflow用户

发布于 2013-04-30 18:59:18

为了将来的参考和其他人,这里是最终的工作代码:

代码语言:javascript
复制
// Original C-Source definition of StreamTimeInfo
// import "oaidl.idl";
// import "ocidl.idl";
// [uuid(A5AA2ACD-BEA0-4570-9232-D8301A6DAE0F)] 
// struct StreamTimeInfo {
//   unsigned int    PID;       
//   LONGLONG        PTS;       
//   LONGLONG        TimeStamp; 
// };
// cpp_quote("typedef struct StreamTimeInfo StreamTimeInfo;")

procedure GetStreamTimes;
type
  TStreamTimeInfo = record
    PID: Cardinal;
    PTS: Int64;
    TimeStamp: Int64;
  end;
  TStreamTimeInfoArray = array[0..31] of TStreamTimeInfo;
  PStreamTimeInfoArray = ^TStreamTimeInfoArray;
var
  Value: OleVariant;
  SizeOfArray: Integer;
  PtrToArray: PStreamTimeInfoArray;
begin
  GetValue(EMPGPDMX_STREAMTIMES, Value);
  if VarArrayDimCount(Value) = 1 then
  begin
    SizeOfArray := 1 + VarArrayHighBound(Value, 1) - VarArrayLowBound(Value, 1);
    PtrToArray := PStreamTimeInfoArray(VarArrayLock(Value));
    try
     for I := 0 to SizeOfArray - 1 do
     begin
       StreamTimeInfo := PtrToArray^[I];
       // Usage Sample:
       // FStatus.StreamTimePID[I] := StreamTimeInfo.PID;
       // FStatus.StreamTimePTS[I] := StreamTimeInfo.PTS;
       // FStatus.StreamTimeTS[I] := StreamTimeInfo.TimeStamp;
     end;
   finally
     VarArrayUnlock(Value);
   end;
  end;
end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16297253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档