如何在 Delphi XE2 中将 IDispatch 转换为 TOleServer?
How to cast an IDispatch as a TOleServer in Delphi XE2?
我正在尝试使用来自
的视频捕获 SDK
在我的 Delphi 应用程序中。他们提供的唯一真正帮助是如何导入他们的类型库!我成功地做到了这一点,并且在我的项目中有一个 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 中的项目 [i] 并选择查找声明将我带到
type
IVideoDeviceCollection = interface(IDispatch)
...
property Item[index: Integer]: IVideoDevice read Get_Item;
...
end;
你应该使用 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];
VideoCaptureUtils.Videodevices.Item[i]
类型为 IVideoDevice
。所以你不能将它转换为 TVideoDevice
。
您需要更正变量的类型:
var
VideoDevice: IVideoDevice;
然后这样赋值:
VideoDevice := VideoCaptureUtils.VideoDevices.Item[i];
我正在尝试使用来自
的视频捕获 SDK在我的 Delphi 应用程序中。他们提供的唯一真正帮助是如何导入他们的类型库!我成功地做到了这一点,并且在我的项目中有一个 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 中的项目 [i] 并选择查找声明将我带到
type
IVideoDeviceCollection = interface(IDispatch)
...
property Item[index: Integer]: IVideoDevice read Get_Item;
...
end;
你应该使用 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];
VideoCaptureUtils.Videodevices.Item[i]
类型为 IVideoDevice
。所以你不能将它转换为 TVideoDevice
。
您需要更正变量的类型:
var
VideoDevice: IVideoDevice;
然后这样赋值:
VideoDevice := VideoCaptureUtils.VideoDevices.Item[i];