Einzelnen Beitrag anzeigen

Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Komponenten registrieren

  Alt 9. Apr 2012, 17:12
Ein kurzer Blick zeigt, dass das Unicodeprobleme sind. Die Unit lässt sich so ja auch gar nicht kompilieren. Zuerst müssen die Verben in Ansizeichen geändert werden. Wie du mit der Unit überhaupt bis zur Schutzverletzung gekommen bist, ist mir ein Rätsel... (Hast du da vielleicht eine falsche Version gepostet? ) Änderungen sind markiert...
Delphi-Quellcode:
function ContextMenuCommand(ContextMenu: IContextMenu; idCmd: Cardinal): string;
var
  ZVerb: array[0..255] of AnsiChar; // changed
begin
  ZVerb[0] := #0;
  if ContextMenu.GetCommandString(idCmd, GCS_VERB, nil,
    ZVerb, SizeOf(ZVerb)) = S_OK then
    Result := ZVerb
  else
    Result := '';
end;

procedure ContextMenuVerb(Handle: THandle; ContextMenu: IContextMenu; Verb: PChar);
var
  CMInvokeCommandInfo: TCMInvokeCommandInfo;
  AnsiVerb: AnsiString; // added
begin
  FillChar(CMInvokeCommandInfo, SizeOf(CMInvokeCommandInfo), 0);
  with CMInvokeCommandInfo do
  begin
    cbSize := SizeOf(CMInvokeCommandInfo);
    hwnd := Handle;
    AnsiVerb := AnsiString(Verb); // added
    lpVerb := PAnsiChar(AnsiVerb); // changed
    nShow := SW_SHOWNORMAL;
  end;
  ContextMenu.InvokeCommand(CMInvokeCommandInfo);
end;

procedure ContextMenuHint(ContextMenu: IContextMenu; Msg: TWMMenuSelect);
var
  idCmd: Cardinal;
  ZVerb: array[0..255] of AnsiChar; // changed
  S: string;
begin
Dann erst kommt die Schutzverletzung. Die wiederum wird genau an der richtigen Stelle angezeigt, so dass das Problem schnell zu sehen ist. Da hat der Autor einen hässlichen Fehler gemacht:

as_shellpackxe2.png

Wie man sehen kann passiert der Fehler beim Durchiterieren der ID-Liste. Wenn man dann mal schaut wie dies passiert, sieht man auch warum es knallt:
Delphi-Quellcode:
function NextPIDL(PIDL: PItemIDList): PItemIDList;
begin
  Result := PIDL;
  Inc(PChar(Result), PIDL^.mkid.cb);
end;
Hier wurde als schmutziger Trick PChar benutzt um Inc auf den Pointer anwenden zu können... PByte gab es damals zwar noch nicht, aber das ist deshalb nicht weniger schlecht. Jedenfalls musst du dort nur PChar in PByte ändern, damit wirklich die Anzahl Bytes weitergegangen wird und nicht doppelt so viel...
Sebastian Jänicke
AppCentral

Geändert von jaenicke ( 9. Apr 2012 um 17:14 Uhr)
  Mit Zitat antworten Zitat