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:
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...