为什么我在Delphi XE2中得到错误的接口方法实现错误?

时间:2012-04-29 16:06:39

标签: delphi delphi-xe2

请考虑以下代码:

uses
  {... }
  ComObj,
  ShlObj;

type
  TContextMenu = class(TComObject, IShellExtInit, IContextMenu)
  private
  {(*}
  const
    GUID: TGUID = '{99D8B139-0855-4C5D-95E7-BC8EC6254B3D}';
  {*)}
  private
    FCmdCount: LongWord;
    FDm: Tdm_ContextMenu;
  protected
    function IShellExtInit.Initialize = IShellExtInit_Initialize;
    function IShellExtInit_Initialize(_pidlFolder: PItemIDList; _lpdobj: IDataObject;
      _HKeyProgID: HKEY): HResult; stdcall;
    function QueryContextMenu(_Menu: HMENU; _indexMenu, _idCmdFirst, _idCmdLast,
      _UFlags: UINT): HResult; stdcall;
    function InvokeCommand(var _ici: TCMInvokeCommandInfo): HResult; stdcall;
    function GetCommandString(_idCmd, _uType: UINT; _pwReserved: PUINT;
      _PszName: LPSTR; _cchMax: UINT): HResult; stdcall;
  public
    procedure Initialize; override;
    destructor Destroy; override;
  end;

这在Delphi 2007和XE中编译得很好但是Delphi XE2给了我错误: “[DCC错误] u_ContextMenuHandler.pas(16):E2291缺少接口方法IContextMenu.GetCommandString的实现”

这令我感到困惑。我检查了接口声明,我的GetCommandString函数与接口的声明完全相同。任何提示?

2 个答案:

答案 0 :(得分:2)

GetCommandString的正确声明是:

function GetCommandString(idCmd: UINT_PTR; uFlags: UINT; pwReserved: PUINT;
  pszName: LPSTR; cchMax: UINT): HResult; stdcall;

在写入GCS_UNICODE之前,请务必检查uFlags中是否存在pszName。该测试确定是否应返回Unicode或ANSI字符串。这种细微差别在documentation

中有所描述

答案 1 :(得分:2)

'_ idCmd'在XE2中声明为UINT_PTR(在定位64位时为8字节)。