Jak odczytać/zapisać właściwości pliku?

Jak odczytać/zapisać właściwości pliku?
PA
  • Rejestracja: dni
  • Ostatnio: dni
0

Jak odczytać/zapisać właściwości pliku?
Chodzi o informacje zawarte w okienku pojawiającym się po wybraniu z menu podręcznego Windows funkcji Właściwości.

user image

Szczególnie właściwości Element docelowy, Rozpocznij w .

adf88
  • Rejestracja: dni
  • Ostatnio: dni
0

Skorzystaj z interfejsu IShellLink. Przykład użycia: http://windowssdk.msdn.microsoft.com/en-us/library/ms649560.aspx#Shellink_Using

06
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2440
0
adf88 napisał(a)

Skorzystaj z interfejsu IShellLink

A ja proponuję interface IShellFolder - można wyciągnąć prawie wszystkie informacje zawarte na karcie "właściwości".

PA
  • Rejestracja: dni
  • Ostatnio: dni
0

Oglądałem IShellLink ale nie bardzo wiem jak używa się tych funkcji. [???]
Sprawdzałem w Vademevum profesjonalisty 5 i 6 dla BCB ale tam tego nie ma :| , a żeby było śmiesznie to w wydaniu dla Delphi jest to opisane :-[

Dla delphi znalazłem przykład

Kopiuj
function TForm1.LnkPath(Plik:WideString):String;
var
  MyObj : IUnknown;
  MyLnk : IShellLink;
  MyPf  : IPersistFile;
  ok    : TWin32FindData;
  Path  : array [0..255] of char;
begin
  MyObj := CreateComObject(CLSID_ShellLink);
  MyLnk := MyObj as IShellLink;
  MyPf  := MyObj as IPersistFile;
  MyPf.Load(PWideChar(Plik),fmOpenRead);
  MyLnk.GetPath(Path, 255, ok, 0);
  Result:=Path;
end;

Trochę przepisałem na BCB ale to ciągle nie jest to [glowa]

Kopiuj
AnsiString TForm1::LnkPath(AnsiString Plik)
{
    IUnknown       MyObj ;
    IShellLink     MyLnk ;
    IPersistFile   MyPf  ;
    TWin32FindData ok;
    char Path[256];

    MyObj =  CreateComObject(CLSID_ShellLink);
    MyLnk =  MyObj as IShellLink;
    MyPf  =  MyObj as IPersistFile;
    MyPf->Load(PWideChar(Plik),fmOpenRead);
    MyLnk->GetPath(Path, 255, ok, 0);
    return CharTo Path;
}

Może mi ktoś pomóc w przetłumaczeniu tego pod BCB [???]

06
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2440
0

Coś w ten deseń:

Kopiuj
AnsiString TForm1::LnkPath(const AnsiString &Plik)
{
	HRESULT 		hr;
	IShellLink*		psl;
	IPersistFile*	ppf;
	wchar_t 		wsz[MAX_PATH];
	char 			path[MAX_PATH];
	WIN32_FIND_DATA fd;

	hr=CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl);
	if(FAILED(hr))return "";

	hr=psl->QueryInterface(IID_IPersistFile,(void**)&ppf);
	if(FAILED(hr))
	{
		psl->Release();
		return "";
	}
	
	Plik.WideChar(wsz,MAX_PATH*sizeof(wchar_t)); //<--- tego pewny nie jestem
	
	hr=ppf->Load(wsz,STGM_READ);
	if(FAILED(hr))
	{
		psl->Release();
		ppf->Release();
		return "";
	}

	hr=psl->GetPath(path,MAX_PATH,&fd,SLGP_UNCPRIORITY);
	if(FAILED(hr))
	{
		psl->Release();
		ppf->Release();
		return "";
	}

	psl->Release();
	ppf->Release();
	return path;
}
PA
  • Rejestracja: dni
  • Ostatnio: dni
0

W tej lini wywala mi błąd :|
hr=CoCreateInstance(CLSID_ShellLink,Null">NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl);
Czepia się Null">NULL O co chodzi [???]
Po pozostawieniu samego NULL program się kompiluje ale zwraca pusty ciąg.
Tutaj wylatuje

Kopiuj
  hr=ppf->Load(wsz,STGM_READ);
        if(FAILED(hr))
        {
                psl->Release();
                ppf->Release();
                return "";
        }

Tak wywołuję funkcję

Kopiuj
    AnsiString plik;

    plik = Edit1->Text; //Tutaj C:\Program Files\Movie Maker\moviemk.exe
    Edit2->Text = LnkPath(plik);

0x666 możesz trochę wyjaśnic ten kod [???] :-)

06
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2440
0

Tak wywołuję funkcję

Kopiuj
    AnsiString plik;

    plik = Edit1->Text; //Tutaj C:\Program Files\Movie Maker\moviemk.exe
    Edit2->Text = LnkPath(plik);

Po pierwsze to chyba prościej tak:

Kopiuj
Edit2->Text = LnkPath(Edit1->Text);

po drugie to co to za ścieżka??? to będzie działać tylko dla skrótów (*.lnk)

PA
  • Rejestracja: dni
  • Ostatnio: dni
0

W drugie: masz rację, coś mi się zamotało :(
A jak się zapisuje właściwości [???]

06
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2440
0
Pablox napisał(a)

A jak się zapisuje właściwości [???]

Właściwości czego??? Jeżeli chodzi o tworzenie skrótów to wygłąda to podobnie:

  1. tworzysz IShellLink
  2. ustawiasz odpowiednio parametry
  3. "tworzysz" IPersistFile
  4. zapisujesz skrót IPersistFile::Save

Jeżeli chcesz edytować włściwości skrótu, to między punktem 1 i 2 wstaw: ładujesz skrót IPersistFile::Load

PS. oczywiście mogę się mylić w którymś punkcie - dawno nie korzystałem z tego interace'u ;)

PA
  • Rejestracja: dni
  • Ostatnio: dni
0

Mam prośbę 0X666 Czy możesz opisać kod który wcześniej podałeś (nazwy i funkcje są starsznie tajemnicze :> ) ?
[green]

06
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2440
0

Ale za wiele nie ma tu do tłumaczenia. Bez podstaw programowania z wykorzystaniem interace'ów shell'a moje tłumaczenia nie wiele dadzą. Zajrzyj do MSDN'u (PSDK)... tam masz wszystko ładnie opisane ;)

np. tu znajdziesz to i owo: Windows Shell

adf88
  • Rejestracja: dni
  • Ostatnio: dni
0

Np. zamiast GetPath użyj SetPath, a przed

psl->Release();
ppf->Release();
return path;
dopisz

Kopiuj
ppf->Save(wsz);
PA
  • Rejestracja: dni
  • Ostatnio: dni
0

Dzięki. Będę walczył teraz na froncie lokalnym :)

skeisym
  • Rejestracja: dni
  • Ostatnio: dni
0

A co jesli chodzi o taka sama operacje w KDE w linuxie? Jak to zrobic?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.