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

SHGetFolderPath - przekazanie wartości CSIDL jako String

Nowy postNapisane: piątek, 7 stycznia 2011, 15:22
przez mckri
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) ;
}

Re: SHGetFolderPath - przekazanie wartości CSIDL jako String

Nowy postNapisane: piątek, 7 stycznia 2011, 16:05
przez polymorphism
Jak to nie dają rady? To co Ty tam wpisujesz 'CSIDL_PERSONAL'?!

Re: SHGetFolderPath - przekazanie wartości CSIDL jako String

Nowy postNapisane: piątek, 7 stycznia 2011, 16:28
przez Cyfrowy Baron
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.

Re: SHGetFolderPath - przekazanie wartości CSIDL jako String

Nowy postNapisane: środa, 12 stycznia 2011, 08:51
przez mckri
Tak tez myslałem, że bez tablicy sie nie obejdzie. Dzieki.