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.
<ort>Niewiem</ort>, czy dobrze zrozumiałem, ale chyba http://4programmers.net/Forum/viewtopic.php?id=53737&post=136624#136624
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;
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
Polecam poczytać o DDE.
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ć!