如何在Delphi XE2中将IDispatch转换为TOleServer?

时间:2015-07-11 15:37:34

标签: delphi com activex ole

我正在尝试使用

中的视频捕获SDK

DTK Software

在我的Delphi App中。他们提供的唯一真正的帮助是如何导入他们的类型库!我成功完成了这项工作,并在我的项目中有一个 DTKVideoCapLib_TLB.pas

我到目前为止。

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  s: String;
  VideoCaptureUtils: TVideoCaptureUtils;
  VideoDevice: TVideoDevice;
begin
    VideoCaptureUtils := TVideoCaptureUtils.Create(Self);
    for i := 0 to VideoCaptureUtils.VideoDevices.Count - 1 do
    begin
       s := VideoCaptureUtils.VideoDevices.Item[i].Name;
       ShowMessage(s);
       VideoDevice := TVideoDevice(VideoCaptureUtils.Videodevices.Item[i]);
    end;

ShowMessage向我显示 Microsoft LifeCam VX-800

所以我必须做对,但是在下一行之后,在调试器中, VideoDevice nil

查看 DTKVideoCapLib_TLB.pas ,我看到以下内容

 TVideoDevice = class(TOleServer)
  private
    FIntf: IVideoDevice;
    function GetDefaultInterface: IVideoDevice;
  protected
  ...

  IVideoDevice = interface(IDispatch)
    ['{8A40EA7D-692C-40EE-9258-6436D1724739}']
    function Get_Name: WideString; safecall;
  ...

所以现在,我真的不知道如何继续这个?

更新

在问题中更正了项目[0]到项目[i]。右键单击IDE中的item [i],然后选择Find Declaration将我带到

type
  IVideoDeviceCollection = interface(IDispatch) 
    ...
    property Item[index: Integer]: IVideoDevice read Get_Item;
    ...
  end;

2 个答案:

答案 0 :(得分:3)

您应该使用as。 Delphi将自动尝试为您获取所需的界面。这样的事情(未经测试!)应该有效:

var
  VideoDevice: IVideoDevice; // note the type of the variable
....
VideoDevice := VideoCaptureUtils.Videodevices.Item[0] as IVideoDevice;

但是,您的更新提供了我在撰写原始答案时未提供的更多详细信息。该更新包含指示Videodevices已包含IVideoDevice的代码,因此您根本不需要转换 - 您只需要正确的变量声明:

var
  VideoDevice: IVideoDevice; // note the type of the variable
....
VideoDevice := VideoCaptureUtils.Videodevices.Item[i];

答案 1 :(得分:1)

VideoCaptureUtils.Videodevices.Item[i]

的类型为IVideoDevice。所以你不能把它投射到TVideoDevice

您需要更正变量的类型:

var
  VideoDevice: IVideoDevice;

然后像这样分配:

VideoDevice := VideoCaptureUtils.VideoDevices.Item[i];