[C++] Ścieżka dostępu do skrótu na pulpicie


(rycerz2000) #1

Pisze program który miałby wykonywać różne operacje na skrótach znajdujących się na pulpicie np. sprawdzanie czy skrót do jakiegoś programu istnieje. Problem w tym że nie wiem ani jaka jest ścieżka dostępu do skrótu ani jak ją sprawdzić. Zatrzymałem się w tym miejscu i nie wiem jak to rozwiązać. Mógłby ktoś podać ścieżkę dostępu do przykładowego skrótu na pulpicie?


(Ryan) #2

Katalog pulpitu bieżącego użytkownika znajdziesz tak:

 

#include <windows.h>
#include <shlobj.h>
#include <stdio.h>

LPTSTR GetCurrentDesktopDir()
{
  TCHAR szPath[MAX_PATH]; // [1]
  if (SHGetSpecialFolderPath(HWND_DESKTOP, szPath, CSIDL_DESKTOPDIRECTORY, FALSE))
    return szPath;
  else
    return NULL;
}

[1] to nie jest dobry pattern, ale wystarczająco dobry tutaj (ścieżki na partycjach NTFS mogą być znacznie dłuższe, ale ścieżka do pulpitu przeważnie nie zbliża się nawet do ~200 znaków).

Enumerację plików w katalogu opisano tutaj:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365200(v=vs.85).aspx

Linki mają przeważnie rozszerzenie lnk. Parsowanie skrótów jest upierdliwe, jeśli chcesz je robić poprawnie - służy do tego COMowy obiekt.

http://msdn.microsoft.com/en-us/library/windows/desktop/bb774950(v=vs.85).aspx

Alternatywnie możesz użyć lnk-parsera z code.google.com, albo wzorując się na nim odczytać to, co dla Ciebie istotne.


(enedil) #3

Eee

%homepath%\Desktop\program.lnk

?


(Ryan) #4

W której funkcji API zmienne środowiskowe zadziałają bez ExpandEnvironmentStrings, hę? :wink:


(enedil) #5

A nie wiem :wink: programuję na Linuksa, a autor pytał się o ścieżkę :wink:


(Ryan) #6

Do pliku lnk. Bardzo powszechnego w Linuksie, prawda? ;]


(enedil) #7

Windowsa co jakiś czas używam, lecz nie programuję na niego.


(tomms) #8

 

Tak, to nie jest dobry pattern, ale dlatego że zwracasz wskaźnik do lokalnej tablicy znaków (która znika po wyjściu z funkcji).


(Ryan) #9

Prawda. Nie mogę zaprzeczyć, że to bezmyślnie napisany na forum kod. Pocieszam się tym, że autor dał już sobie chyba spokój z projektem. Dla potomności: dostarczajcie pamięć do funkcji, a nie tak jak to zrobiłem ja.