FAQ | Points | Add... | Recent posts | Search | Register | Log in


[C#] Skróty "bez ścieżki"


Post new topic  Reply to topic      Main Page -> Forum Index -> Programming Generally -> [C#] Skróty "bez ścieżki"
Author
Message
LED5W
Poziom 20
Poziom 20


Joined: 18 Aug 2007
Posts: 940

Post#1 Post from the author of the topic 13 Mar 2010 22:38   

[C#] Skróty "bez ścieżki"


Witam

Mam taki kod do sprawdzania poprawności skrótów:
Code:
private bool CheckShortcut(string path)
{
    IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShell();
    IWshRuntimeLibrary.WshShortcut shortcut = (IWshRuntimeLibrary.WshShortcut)shell.CreateShortcut(path);
    if (File.Exists(shortcut.TargetPath))
        return true;
    return new DirectoryInfo(shortcut.TargetPath).Exists;
}

Jednak jest problem z niektórymi skrótami - shortcut.TargetPath jest wtedy ciągiem pustym.
Dzieje się tak ze skrótami, które eksplorator wyświetla w ten sposób (patrz "Element docelowy"):
[C#] Skróty "bez ścieżki"

Jak to "rozgryźć"?
Back to top
   
Dżyszla
Poziom 24
Poziom 24


Joined: 15 May 2005
Posts: 4528
Location: Żory (kiedyś Opole)

Post#2 13 Mar 2010 23:16   

Re: [C#] Skróty "bez ścieżki"


w tym konkretnym przypadku lokalizacja rozpoznawana jest prawdopodobnie na podstawie rozszerzenia/typu.

Generalnie przeszukiwane są katalogi ze zmiennej PATH
Back to top
   
Google

Google Adsense


Post# 13 Mar 2010 23:16   





Back to top
   
LED5W
Poziom 20
Poziom 20


Joined: 18 Aug 2007
Posts: 940

Post#3 Post from the author of the topic 15 Mar 2010 19:24   

Re: [C#] Skróty "bez ścieżki"


Dżyszla wrote:
w tym konkretnym przypadku lokalizacja rozpoznawana jest prawdopodobnie na podstawie rozszerzenia/typu.

Rozszerzenie to zawsze lnk...

Dżyszla wrote:
Generalnie przeszukiwane są katalogi ze zmiennej PATH

Generalnie nie łapię. :P

W zmiennej path - nie PATH - jest przekazywana pełna ścieżka do pliku ".lnk" (łącznie z nazwą pliku).
Mogę prosić o jakiś przykład, szczegóły, czego szukać, aby sprawdzić poprawność takiego skrótu?
Back to top
   
Dżyszla
Poziom 24
Poziom 24


Joined: 15 May 2005
Posts: 4528
Location: Żory (kiedyś Opole)

Post#4 15 Mar 2010 20:56   

Re: [C#] Skróty "bez ścieżki"


1. Rozszerzenia zlinkowanego pliku, a nie linku.
2. Wielkość liter zmiennych systemowych nie ma znaczenia - set path i set PATH zwrócą to samo.

Ostatniego akapitu ja nie rozumiem zupełnie. Zmienna PATH zawiera listę katalogów, które są przeszukiwane do odnalezienia pliku, który wywoływany jest bez podania katalogu oraz nie znajduje się w katalogu roboczym. Poprawność takiego skrótu, który właśnie nie podaje katalogu można sprawdzić przeglądając wszystkie katalogi ze zmiennej PATH (kolejność też ma znaczenie tak na marginesie).
Przy okazji, Windows NT (chyba) wprowadził taką zmienną, jak PATHEXT, która wskazuje rozszerzenia plików, jakie mają być przeszukiwane w katalogach ze zmiennej PATH.
Back to top
   
PanBo
Poziom 12
Poziom 12


Joined: 29 Sep 2009
Posts: 94

Post#5 16 Mar 2010 08:54   

Re: [C#] Skróty "bez ścieżki"


Po co komu PATH skoro nawet nie wiadomo czego szukać?
Rozszerzenie zlinkowanego pliku (razem z nazwą) to właśnie coś o co pyta autor tego tematu - jak to odczytać, bo w obiekcie klasy WshShortcut nie ma NIC. Ani ścieżki, ani nazwy, ani rozszerzenia.
Back to top
   
LED5W
Poziom 20
Poziom 20


Joined: 18 Aug 2007
Posts: 940

Post#6 Post from the author of the topic 16 Mar 2010 16:49   

Re: [C#] Skróty "bez ścieżki"


I jestem dalej w punkcie wyjścia. :(
Ścieżkę folderu mogę sobie znaleźć w zmiennej systemowej Path - ale skąd wiedzieć, która jest właściwa, jeśli były by dwie ścieżki z docelowym plikiem, wziąć pierwszą?

Skąd odczytać jakiego pliku mam szukać?

Na przykład otwierając "Opcje zasilania" zostaje uruchomione:
Code:
"C:\WINDOWS\system32\rundll32.exe" C:\WINDOWS\system32\shell32.dll,Control_RunDLL "C:\WINDOWS\system32\powercfg.cpl",Opcje zasilania

Jak to wszystko odczytać?

Dodano po 27 [minuty]:

Otworzyłem ten skrót w notatniku i...
Quote:
L  Ŕ F  " PŕOĐ ę:i˘Ř +00ť . ě!ę:i˘Ý +00ťř 6˙˙˙ j ! 1 C : \ W I N D O W S \ s y s t e m 3 2 \ p o w e r c f g . c p l O p c j e z a s i l a n i a K o n f i g u r u j u s t a w i e n i a o s z c z d z a n i a e n e r g i i d l a t e g o k o m p u t e r a .

Czyli wygląda na to, że z tą zmienną Path to było nie trafione...
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 16 Mar 2010 16:49   





Back to top
   
Dżyszla
Poziom 24
Poziom 24


Joined: 15 May 2005
Posts: 4528
Location: Żory (kiedyś Opole)

Post#7 16 Mar 2010 17:39   

Re: [C#] Skróty "bez ścieżki"


PanBo - a skąd taki wniosek? Ja rozumiem, że aplikacja miała sprawdzać istnienie elementu docelowego. A poza tym WIADOMO gdzie szukać - w katalogu roboczym, jak nie ma to w pierwszym katalogu zmiennej PATH, jak nie ma to w drugim katalogu zmiennej PATH itd. Nie ma żadnych niewiadomych.

LED5W - tak, bierzesz pierwszą w przypadku istnienia pliku w dwóch z podanych ścieżek.

Co do paneli sterowania - ich uruchomieniem zajmuje się plik DLL, którego funkcję wywołuje program rundll32. Zaś to, że on jest skojarzony z danym rozszerzeniem to już kwestia systemu Windows i wpisu w kluczu HKCL.

Do czytania linków posługuj się funkcjami systemowymi i na nich bazuj, bo nigdy nie wiadomo, jak dany system zapisuje linki.

(Zrobiłem mały test i faktycznie system zawsze podstawia ścieżkę - ale przed XP mogło tak nie być).
Back to top
   
PanBo
Poziom 12
Poziom 12


Joined: 29 Sep 2009
Posts: 94

Post#8 16 Mar 2010 21:15   

Re: [C#] Skróty "bez ścieżki"


Jak to nie ma niewiadomych? Funkcje systemowe zwracają puste stringi w przypadku np skrótów z panelu. Jak dla mnie to niewiadoma, bo własny loader plików *.lnk to rozwiązanie paskudne.

Temat mnie zainteresował i trochę pownikałem, co prawda celu nie osiągnąłem ale może się przyda to co znalazłem:
1. Dodając referencję COM na "Microsoft Shell Controls And Automation" uzyskasz dostęp do interfejsu ShellLinkObject i tym samym do metody Resolve, która próbuje znaleźć cel skrótu i jeśli to się nie powiedzie wyświetla systemowy komunikat. Niestety, o ile komunikat można wyłączyć to nie udało mi się z poziomu kodu dojść do informacji czy ten skrót udało się rozwiązać czy nie, mimo że MSDN twierdzi że funkcja to zwraca. Jednak wykorzystanie mechanizmu Resolve byłoby pewnie najlepsze (do weryfikacji poprawności skrótów).
2. Po dodaniu do projektu kodu stąd uzyskuje się dostęp do metody IShellLink::GetPidList zwracającej wartość która wydaje się kluczem do sukcesu :) (jednak nie udało mi się na szybko wyciągnąć z tego nic sensownego)

Pozdr.
Back to top
   
LED5W
Poziom 20
Poziom 20


Joined: 18 Aug 2007
Posts: 940

Post#9 Post from the author of the topic 17 Mar 2010 12:36   

Re: [C#] Skróty "bez ścieżki"


PanBo wrote:
Temat mnie zainteresował i trochę pownikałem

Fajnie. :)

2. Chodzi o ten ostatni kod? Bo nie widzę tam GetPidList.

Coś będę z tym kombinował. Jednak byłbym bardzo wdzięczny za działający przykład. ;)
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 17 Mar 2010 12:36   





Back to top
   
LED5W
Poziom 20
Poziom 20


Joined: 18 Aug 2007
Posts: 940

Post#10 Post from the author of the topic 19 Mar 2010 14:44   

Re: [C#] Skróty "bez ścieżki"


Jakoś sobie z tym nie radzę. :cry:
PanBo. Mógłbyś podać kody, których używałeś do testów?
Back to top
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Programming Generally -> [C#] Skróty "bez ścieżki"
Page 1 of 1
Similar topics
Zna ktoś "Delphiego" i "C" (protokół (8)
"czytnik kart magnetycznych"+"bascom"+&q (4)
POV-Ray - " include "tools.inc" " - o co (24)
KiCad - nie znajduje pół "+" i "-"elektr (5)
WINAPI Menu - "tick", czyli "ptaszek" w (1)
PIC-e z literą "A" i bez (1)
[PHP, HTML] Jak zrobić stronę "ramkową" bez ramek? (20)
[C++] Skróty klawiszowe "globalne" (4)
Typowy układ "wy" dla logicznego "0" - p (7)
[Visual Studio C++] jak zamienić "." na "," (2)

Page generation time: 0.092 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed