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

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 .

0

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

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

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

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]

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 [???]

0

Coś w ten deseń:

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;
}
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

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

Tak wywołuję funkcję

    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 [???] :-)

0

Tak wywołuję funkcję

    AnsiString plik;

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

Po pierwsze to chyba prościej tak:

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

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

0

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

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 ;)

0

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

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

0

Np. zamiast GetPath użyj SetPath, a przed

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

ppf->Save(wsz);
0

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

0

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

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