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.
Szczególnie właściwości Element docelowy, Rozpocznij w .
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.
Szczególnie właściwości Element docelowy, Rozpocznij w .
Skorzystaj z interfejsu IShellLink. Przykład użycia: http://windowssdk.msdn.microsoft.com/en-us/library/ms649560.aspx#Shellink_Using
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".
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 [???]
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;
}
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 [???] :-)
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)
W drugie: masz rację, coś mi się zamotało :(
A jak się zapisuje właściwości [???]
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:
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 ;)
Mam prośbę 0X666 Czy możesz opisać kod który wcześniej podałeś (nazwy i funkcje są starsznie tajemnicze :> ) ?
[green]
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
Np. zamiast GetPath użyj SetPath, a przed
psl->Release();
ppf->Release();
return path;
dopisz
ppf->Save(wsz);
Dzięki. Będę walczył teraz na froncie lokalnym :)
A co jesli chodzi o taka sama operacje w KDE w linuxie? Jak to zrobic?