Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Teoretycznie działa. Jednak problem się pojawia, gdy zmienię profil w Windowsie, który posiada polskie litery np. profil o nazwie Paweł, pojawia się błąd i nie tworzy folderu - polskie znaki zamieniają się w ?. Próbowałem używać AnsitoUTF8 i UTF8toAnsii ale nie pomogło.
Funkcja SHGetSpecialFolderPath jest przestarzała i w niedalekiej przyszłości zostanie całkowicie usunięta z WinAPI. Dla wsparcia systemów starszych niż Vista wykorzystaj SHGetFolderPath, a dla nowszych użyj SHGetKnownFolderPath.
Po drugie, używaj funkcji z sufiksem W, czyli wersji wspierającej unikod.
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.9994231)
Pojawia mi się błąd podczas kompilacji z uwagi na "LPWSTR", nie wiem jak sobie z nim poradzić
Wklej dokładny komunikat błędu, jeśli chcesz szybko uzyskać pomoc.
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
Mariusz Bruniewski
Mariusz Bruniewski
Rejestracja:prawie 20 lat
Ostatnio:ponad 3 lata
Lokalizacja:Świecie
0
Proponuję utworzyć folder z uprawnieniami administratora. Możesz mieć kod, który działa poprawnie a stanie się dla Ciebie łamigłówką. tylko z pozycji uprawnień. kod działa w delphi i lazarusie.
Kopiuj
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShlObj, StdCtrls;type
TForm1 =class(TForm)
Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;var
Form1: TForm1;implementation{$R *.dfm}function FolderDesktop(const Folder: Integer):string;var
Path: shortstring;begin
SHGetSpecialFolderPath(0,@Path, Folder ,False);
FolderDesktop := StrPas(@Path);end;procedure TForm1.Button1Click(Sender: TObject);var
Sciezka:string;
s :string;begin
s := InputBox('Podaj nazwę folderu','Podaj proszę nazwę folderu utworzonego w Pulpit', s);
Sciezka := FolderDesktop(CSIDL_DESKTOP);
Caption :='Ścieżka zostanie utworzona'+Sciezka;
CreateDir(Sciezka+'\'+s);// Nowy folder o nazwie wpisanej do inputboxend;end.
W takim razie, kiedy masz do czynienia z polskimi znakami w ścieżce używaj nazwy DOS Np.
Kopiuj
begin
Showmessage('LOKALIZACJA PROGRAMU Project1.exe'+#13+'Ścieżka pełna : '+Application.ExeName+#13+'Ścieżka skrócona : '+ExtractShortPathName(application.ExeName);end;
Funkcja SHGetSpecialFolderPath jest przestarzała i nie warto jej w ogóle używać. To już nie chodzi o to, że jest zdeprecjonowana – została już oznaczona jako niewspierana, więc przy najbliższej okazji zostanie całkowicie usunięta z biblioteki systemowej. A to spowoduje, że programy ją wykorzystujące nie dość że nie będą działać prawidłowo, to mogą się w ogóle nie uruchomić, skoro nie znajdą punktu wejścia. Tak więc to co proponujesz nie ma najmniejszego sensu.
Jeśli zależy komuś na wsparciu systemów starszych niż Vista, należy skorzystać z funkcji SHGetFolderPath. Ta funkcja jest zdeprecjonowana, ale w najbliższych latach nie grozi jej usunięcie z API. Dla systemów Vista+ jest funkcja SHGetKnownFolderPath, więc jeśli wsparcie starych systemów nie jest potrzebne, jej należy użyć.
przy najbliższej okazji zostanie całkowicie usunięta z biblioteki systemowej - mocno wątpliwe, Microsoft nie usuwa API na prawo i lewo, bo kompatybilność wsteczna się dla nich liczy.
Witam jeszcze raz.
korzystałem z różnych podpowiedzi jednak żadna nie przyniosła rozwiązania problemu związanego z stworzeniem folderu na pulpicie. Wszystko niby działa do czasu konta w Windows z polskimi znakami. Za każdym razem występuje komunikat "Nie wykonano procedury gdyż nie znaleziono \Pawe?\Deskop\Test"
Kopiuj
np.
uses
...shlobj...
const
FOLDERID_DESKTOP: TGUID = '{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}';
KF_FLAG_CREATE = $00008000;
function SHGetKnownFolderPath(const rfid: TGUID; dwFlags: DWord; hToken: THandle; var ppszPath: LPWSTR): HResult; stdcall; external 'Shell32.dll';
podczas kompilacji wyskakuje błąd
Kopiuj
unit5.pas(406,1) Error: Identifier not found "LPWSTR"
Czy mógłbym prosić o jakąś podpowiedź co robię źle?
unit5.pas(406,1) Error: Identifier not found "LPWSTR"
Czy mógłbym prosić o jakąś podpowiedź co robię źle?
Źle robisz, że nie próbujesz zrozumieć dlaczego ten błąd dostajesz. ;)
A powód jest prosty – typ danych LPWSTR nie jest znany w czasie kompilacji, więc musisz dodać moduł, który zawiera jego deklarację. Jest to typ danych przeznaczony dla funkcji WinAPI, więc jego deklaracja znajduje się w module Windows. Tak więc dodaj ten moduł do listy uses i próbuj.
Choć @Paweł Dmitruk podał jeszcze inne rozwiązanie, więc spróbuj też jego sugestii.
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.99799985)
Co do modułu Windows to mogę nadmienić, że po jego wpisaniu pojawił mi się kolejny błąd przy istniejących procedurach w kodzie źródłowym
Znany problem – występuje ”kolizja” identyfikatorów i kompilator wybiera pierwszy znany. Widać w Twoim przypadku, typ POINT z modułu Windows znany jest wcześniej niż funkcja Point z modułu Types (lub Classes), dlatego ten jest brany pod uwagę. Zapis z nawiasami kompilator traktuje jako rzutowanie, w którym przecinek oczywiście nie jest dozwolony – rzutowanie jest jednoargumentowe (jako wartość lub wynik wyrażenia). Dlatego określenie pochodzenia identyfikatora (jak pokazał @Paweł Dmitruk wyżej) jest konieczne.
To samo będzie w przypadku typu Windows.RECT oraz funkcji Types.Rect. Dlatego zamiast używania funkcji, polecam wykorzystać konstruktory typów danych, np. TPoint.Create czy TRect.Create – ból głowy będzie mniejszy.