Почему я получаю сообщение об ошибке "Отсутствует реализация метода интерфейса в 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 ответа

Решение

'_idCmd' объявлен UINT_PTR (что составляет 8 байт при таргетинге на 64-битную версию) в XE2.

Правильная декларация GetCommandString является:

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

Убедитесь, что вы проверите на наличие GCS_UNICODE в uFlags перед тем как написать pszName, Этот тест определяет, следует ли возвращать строку Unicode или ANSI. Этот нюанс описан в документации.

Другие вопросы по тегам