Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Delphi XE2中会出现缺少接口方法实现的错误?_Delphi_Delphi Xe2 - Fatal编程技术网

为什么在Delphi XE2中会出现缺少接口方法实现的错误?

为什么在Delphi XE2中会出现缺少接口方法实现的错误?,delphi,delphi-xe2,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: Td

考虑以下代码:

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函数的声明与接口的声明完全相同。有什么提示吗?

GetCommandString的正确声明是:

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

在写入
pszName
之前,请确保检查
uFlags
中是否存在
GCS\u UNICODE
。该测试确定是否应返回Unicode或ANSI字符串。这种细微差别在中有描述。

GetCommandString的正确声明是:

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

在写入
pszName
之前,请确保检查
uFlags
中是否存在
GCS\u UNICODE
。该测试确定是否应返回Unicode或ANSI字符串。这一细微差别在中有描述。

在XE2中声明了“\u idCmd”(当目标为64位时为8字节)。

在XE2中声明了“\u idCmd”(当目标为64位时为8字节)。

将在David恢复他的时删除此答案。@David-好的,但您的答案更全面:)Argh,你是对的!但它说的是“缺少实现”而不是“类型不匹配”-(编译器错误是正确的。接口函数的实现确实丢失了。为了提供有效的实现,您需要匹配名称、参数列表、返回类型和调用约定。当David恢复其答案时,将删除此答案。@David-好的,可以,但您的答案更全面:)啊,您说得对!但它说的是“缺少实现”而不是“类型不匹配”-(编译器错误正确。确实缺少接口函数的实现。为了提供有效的实现,您需要匹配名称、参数列表、返回类型和调用约定。