为什么在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-好的,可以,但您的答案更全面:)啊,您说得对!但它说的是“缺少实现”而不是“类型不匹配”-(编译器错误正确。确实缺少接口函数的实现。为了提供有效的实现,您需要匹配名称、参数列表、返回类型和调用约定。