Explorator windows

0

ort! sobie program z plikami exe dll
i dodałem do menu exploratora windows
A mam problem taki.
Zaznaczam sobie
w exploratorze np 3 pliki i chce aby po wywołaniu mojego programu
z menu dodać ścieżki dostępu do tych plików
np do LIstBoxa. No i to by było na tyle.

0

<ort>Niewiem</ort>, czy dobrze zrozumiałem, ale chyba http://4programmers.net/Forum/viewtopic.php?id=53737&post=136624#136624

0

A mi się wydaje, że chodzi o to:

var I:Integer;
begin
For I:=0 to ParamCount-1 do
             ListBox1.Items.Add( ParamStr(I) );
end;
0

cimak Niestety próbowałem twojego już dawno temu i to nie chodzi
dodaje to tylko ściezke jednego z zaznaczonych plików

Napisze to triche inaczej aby wszyscy zrozumieli

Mamy sobie zaistalowanego Winamp-a
Zaznaczamy w exploratorze 4 pliki mp3 wybieramy z menu Play in Winamp
i po tym uruchamia sie winamp a w plejliście znadują się nazwy wszystkich zaznaczonych uprzednio plików
czyli Playlista WinAmp ma być ListBoxem w moim programie
NO WŁASNIE o to michodzi

0

Polecam poczytać o DDE.

0

Możliwe są tutaj dwa przypadki:

Twój program jest już uruchomiony.
Użytkownik zaznacza w Exploratorze kilka plików (skojarzonych z Twoim programem) i klika odpowiednią pozycję w menu kontekstowym Exploratora.

W takiej sytuacji możesz zastosować taki mechanizm:

  • w pliku projektu (DPR), na samym początku sprawdzasz, czy został przekazany jakiś parametr (z nazwą pliku)
  • jeśli tak, to sprawdzasz, czy istnieje już uruchomiona instancja Twojego programu
  • jeśli tak, to wysyłasz do niego komunikat WM_COPYDATA z odpowiednimi danymi (z nazwą pliku) i kończysz bieżącą instancję programu
  • w pliku Unit1.pas (z oknem głównym) musisz przechwycić komunikat WM_COPYDATA i odpowiednio zareagować (np. dodać nazwę pliku do ListBox-a).

Zamiast komunikatów możesz wykorzystać DDE.

Twój program NIE jest uruchomiony.
Użytkownik zaznacza w Exploratorze kilka plików (skojarzonych z Twoim programem) i klika odpowiednią pozycję w menu kontekstowym Exploratora.

Tutaj problem polega na tym, że jeśli dodasz pozycję do menu kontekstowego Exploratora w sposób "standardowy", to po wybraniu np. 5 plików w Eksploratorze i kliknięciu w menu kontekstowym tej pozycji, Twój program zostanie uruchomiony właśnie 5 razy, a do każdej instancji programu zostanie przesłany jeden (kolejny) parametr.
Jeśli chcesz aby do Twojego programu została przekazana lista zaznaczonych w Exploratorze plików, musisz napisać DLL-a z tzw. ShellExtension.
Przeczytaj dokładnie co na ten temat pisze w MSDN-ie: http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_int/shell_int_extending/extensionhandlers/contextmenuhandlers.asp.

Dobry przykład (prawie gotowiec) masz w: katalog_z_Delphi\Demos\ActiveX\ShellExt\ContextM.pas.
Kilka najważniejszych zmian, które musisz dokonać w ContextM.pas:

Dodaj moduł SysUtils do klauzuli uses w części interfejsowej modułu.
Usuń moduł SysUtils z klauzuli uses w części implemenatcyjnej.
W sekcji private klasy TContextMenu dodaj: ArrFiles: array of TFileName;

Zmień SEIInitialize na:

function TContextMenu.SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject; hKeyProgID: HKEY): HResult;
var
  StgMedium: TStgMedium;
  FormatEtc: TFormatEtc;
  dwX: DWORD;
begin
  if (lpdobj = nil) then begin
    Result := E_INVALIDARG;
    Exit;
  end;

  with FormatEtc do begin
    cfFormat := CF_HDROP;
    ptd      := nil;
    dwAspect := DVASPECT_CONTENT;
    lindex   := -1;
    tymed    := TYMED_HGLOBAL;
  end;

  Result := lpdobj.GetData(FormatEtc, StgMedium);
  if Failed(Result) then Exit;
  // w ArrFiles zostaje zapisana lista plików zaznaczonych w Exploratorze !
  //!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/
  dwX := DragQueryFile(StgMedium.hGlobal, $FFFFFFFF, nil, 0); //<-- dwX - liczba zaznaczonych plików
  for i := 0 to dwX - 1 do
  begin
    FillChar(FFileName, SizeOf(FFileName), 0);
    DragQueryFile(StgMedium.hGlobal, i, FFileName, SizeOf(FFileName));
    SetLength(ArrFiles, Length(ArrFiles) + 1);
    ArrFiles[Length(ArrFiles) - 1] := TFileName(FFileName);
  end;
  //!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/!/
  ReleaseStgMedium(StgMedium);
end;

W procedurze TContextMenuFactory.UpdateRegistry musisz zarejestrować ShellExtension dla plików, które Cię interesują. (w oryginale są to pliki DPR).

Teraz w TContextMenu.InvokeCommand musisz uruchomić swój program i przekazać do niego listę plików pamiętanych w ArrFiles (w parametrach, przez komunikaty, DDE...)

Z resztą powninieneś sobie poradzić!

1 użytkowników online, w tym zalogowanych: 0, gości: 1