CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - SHGetFolderPath - przekazanie wartości CSIDL jako String

SHGetFolderPath - przekazanie wartości CSIDL jako String

dział ogólny

SHGetFolderPath - przekazanie wartości CSIDL jako String

Nowy postprzez mckri » piątek, 7 stycznia 2011, 15:22

Witam.
Funkcja SHGetFolderPath pozwala na odczytanie wartości niektórych folderów specjalnych z Windows. Wszystko działa fajnie, jak wewnątrz funkcji zostanie podane konkretne CSIDL... o które chcemy się zapytać systemu.
Problem mam tego typu, że przy przekazywaniu wartości CSIDL jako string do funkcji SHGetFolderPath jest problem z konwersją z typu String na Int.
Próbowałem roznych sposóbów konwersji, jednak typowe konwersje string na int nie dają rady. Macie jakiś pomysł?
Fragment kodu:
Kod: Zaznacz cały
TCHAR szPath[MAX_PATH];
if(SUCCEEDED(SHGetFolderPath(NULL,StrToInt(Edit1->Text) /*CSIDL_PERSONAL*/ ,NULL,0,szPath)))
{
    ShowMessage(szPath) ;
}
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: SHGetFolderPath - przekazanie wartości CSIDL jako String

Nowy postprzez polymorphism » piątek, 7 stycznia 2011, 16:05

Jak to nie dają rady? To co Ty tam wpisujesz 'CSIDL_PERSONAL'?!
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: SHGetFolderPath - przekazanie wartości CSIDL jako String

Nowy postprzez Cyfrowy Baron » piątek, 7 stycznia 2011, 16:28

Co wpisujesz w polu Edit1->Text, czy jakąś liczbę, czy też tekst np. CSIDL_PERSONAL. Bo jeżeli tekst to jest oczywiste, że nie można dokonać konwersji tekstu na liczbę.
CSIDL_PERSONAL to identyfikator zdefiniowany w bibliotece shlobj.h i ma taką postać:

KOD cpp:     UKRYJ  
#define CSIDL_PERSONAL                  0x0005        // My Documents


To oznacza, że na etapie programowania możesz podawać zamiast wartości 5 wartość CSIDL_PERSONAL, ale w Edit1 musisz podać wartość 5.
Możesz ewentualnie w kodzie stworzyć sobie odpowiednią tablicę, np:

KOD cpp:     UKRYJ  
#include <shlobj.h>
#include <map>

 std::map<AnsiString, int> csidlName;
 csidlName["CSIDL_PERSONAL"]  = CSIDL_PERSONAL;
 csidlName["CSIDL_FAVORITES"] = CSIDL_FAVORITES;
 csidlName["CSIDL_DESKTOP"]   = CSIDL_DESKTOP;
 // itd... wypałniasz tablicę

 TCHAR szPath[MAX_PATH];
 if(SUCCEEDED(SHGetFolderPath(NULL, csidlName[Edit1->Text], NULL, 0, szPath)))
 {
    ShowMessage((String)szPath) ;
 }


Teraz możesz już sobie wpisywać zdefiniowane nazwy wartości.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: SHGetFolderPath - przekazanie wartości CSIDL jako String

Nowy postprzez mckri » środa, 12 stycznia 2011, 08:51

Tak tez myslałem, że bez tablicy sie nie obejdzie. Dzieki.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 9 gości

cron