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

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?

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.

Eee

%homepath%\Desktop\program.lnk

?

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

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

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

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

 

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

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.