1

次のコードを検討してください。

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;

これはDelphi2007およびXEで正常にコンパイルされますが、DelphiXE2では次のエラーが発生します。「[DCCエラー]u_ContextMenuHandler.pas(16):E2291インターフェイスメソッドIContextMenu.GetCommandStringの実装がありません」

これは私を困惑させました。インターフェイスの宣言を確認しましたが、GetCommandString関数の宣言はインターフェイスの宣言とまったく同じです。ヒントはありますか?

4

2 に答える 2

2

の正しい宣言GetCommandStringは次のとおりです。

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

に書き込む前に、 GCS_UNICODEinの存在を確認してください。このテストでは、UnicodeまたはANSI文字列を返す必要があるかどうかを判断します。このニュアンスは、ドキュメントで説明されています。uFlagspszName

于 2012-04-29T16:10:35.453 に答える
2

XE2 では '_idCmd' が宣言されUINT_PTRています (64 ビットを対象とする場合は 8 バイト)。

于 2012-04-29T16:16:26.140 に答える