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