Witam. Chciałbym zrobić menu kontekstowe do swojego programu, ale mam drobny problem (w zasadzie dwa, ale to za chwile). Wzoruje się na tym przykładzie, w którym niestety owe menu działa tylko dla jednego zaznaczonego pliku. Wprowadziłem wiec małe poprawki...
Ten kod:
if (DragQueryFile(StgMedium.hGlobal, $FFFFFFFF, NIL, 0) = 1) then
begin
SetLength(FFileName, MAX_PATH);
DragQueryFile(StgMedium.hGlobal, 0, PChar(FFileName), MAX_PATH);
SetLength(FFileName, lstrlen(PChar(FFileName)));
Result := S_OK;
end
else
begin
FFileName := '';
Result := E_FAIL;
end;
Zastąpiłem tym:
DroppedFileCount := DragQueryFile(StgMedium.hGlobal, $FFFFFFFF, NIL, 0);
if DroppedFileCount = 0 then
begin
FFiles.Clear;
//FFileName := '';
Result := E_FAIL;
end
else
begin
FFiles.Clear;
for i := 0 to DroppedFileCount - 1 do
begin
SetLength(FFileName, MAX_PATH);
DragQueryFile(StgMedium.hGlobal, i, PChar(FFileName), MAX_PATH);
SetLength(FFileName, lstrlen(PChar(FFileName)));
FFiles.Append(FFileName);
//MessageBox(0, PChar(FFileName), cClassName, mb_OK or mb_IconInformation);
end;
Result := S_OK;
end;
I tutaj właśnie pojawia się problem bo gdzieś trzeba FFiles (TStrings) stworzyć. Klasa TGetExeInfoShellExt ma tylko deklaracje destruktora, wiec dopisałem:
TGetExeInfoShellExt = class(TInterfacedObject, IShellExtInit, IContextMenu)
private
FFiles: TStrings;
...
public
constructor Create;
destructor Destroy; override;
...
end;
constructor TGetExeInfoShellExt.Create;
begin
inherited;
FFiles := TStringList.Create;
end;
Czy to jest poprawnie zrobione? Biorąc pod uwagę, ze będzie to rozszerzenie powłoki, chciałbym uniknąć jakiejkolwiek wpadki.
Drugi problem z jakim się borykam, to brak przezroczystej ikony na win7 (działa tylko na XP). Ktoś podpowie jak to zrobić?