我需要编译Inno Media Player 0.03的源代码,我使用Delphi为它修改了一个Cursor Hiding功能。
我成功地将代码添加到源代码并尝试重新编译,但编译器说:
[dcc32错误] MainUnit.pas(154):E2010不兼容的类型:'LongBool'和'Integer'。
此代码有什么问题?
我添加到INNO MEDIA PLAYER的代码:
const
OATRUE = -1;
procedure TDirectShowPlayer.InitializeVideoWindow(WindowHandle: HWND; var Width,
Height: Integer);
begin
ErrorCheck(FGraphBuilder.QueryInterface(IVideoWindow, FVideoWindow));
ErrorCheck(FVideoWindow.HideCursor(OATRUE)); **<<<ERROR IS HERE<<<**
...
end;
我在IVideoWindow::HideCursor
的{{1}}上调用了FVideoWindow
方法。
TDirectShowPlayer.InitializeVideoWindow
常数为OATRUE
,System.Shortint
为IVideoWindow.HideCursor
方法。
那些不兼容的类型或我的Delphi版本是否与我添加的此代码不兼容?
答案 0 :(得分:4)
在MSDN上,IVideoWindow.HideCursor()
被声明为long
作为输入,而不是BOOL
,所以它不应该在Delphi中声明为LongBool
,它应该是而是Longint
。所以要么修复声明,要么使用类型转换:
ErrorCheck(FVideoWindow.HideCursor(BOOL(OATRUE)));
答案 1 :(得分:3)
根据DirectShow documentation on IVideoWindow::HideCursor
方法签名是:
HRESULT HideCursor(
[in] long HideCursor
);
而Progdigy的Pascal翻译中的相应签名是:
function HideCursor(HideCursor: LongBool): HResult; stdcall;
因此,虽然您的代码绝对符合MS规范,但您必须以某种方式处理不正确的类型声明。您需要将常量类型转换为声明的类型:
ErrorCheck(FVideoWindow.HideCursor(LongBool(OATRUE)));
注意:只要将True
传递给HideCursor
,也可能会有效,前提是DirectShow对精确值不敏感。请谨慎使用。