不兼容的类型“LongBool”和“Integer”

时间:2016-06-28 04:36:01

标签: delphi

我需要编译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常数为OATRUESystem.ShortintIVideoWindow.HideCursor方法。

那些不兼容的类型或我的Delphi版本是否与我添加的此代码不兼容?

2 个答案:

答案 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对精确值不敏感。请谨慎使用。