- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
procedure TMainForm.FormCreate(Sender: TObject);
var
s : String;
reg : TRegistry;
begin
SetLength (s, Max_Path);
SHGetSpecialFolderPath (0, PChar(s), CSIDL_COMMON_APPDATA, false);
AppDataPath := s + '\Test\';
ShowMessage (AppDATAPath);
end;
, где AppDataPath : string;
Только вот в AppDataPath находиться только S, а должно быть s + '\Test\'
Вопрос: Почему?
Заранее благодарен
Потому что нельзя передавать паскалевскую строку в виде PChar в функцию, которая будет её там модифицировать. Нужно делать так:
Код:
var
s : array[ 0..MAX_PATH ] of Char;
reg : TRegistry;
begin
s[ 0 ] := #0;
SHGetSpecialFolderPath (0, s, CSIDL_COMMON_APPDATA, false);
AppDataPath := s + '\Test\';
ShowMessage (AppDATAPath);
end;
http://www.programmersforum.ru/showthread.php?t=84319
Кстати, третий минус я сам себе вдрючил. Слегка шокирован.
Ловко это ты... Чтобы никто не подумал, что это твоя файка...
Далеко пойдёшь.
Кстати, а в чём ошибка? Почему не происходит конкатенация?
Что за дебильное слово? Почему не "контактация" (логично - контакт двух строк)?
When you call the SetLength procedure, the string is extended. When SHGetSpecialFolderPath is called, writes to the string and puts a null character at the end of the data. The first character of the Pascal-string stored the length of the string, even you can have a zero character not even at the end of the data and in the middle, but you can not say this about ShowMessage, based on the API MessageBox, waiting for a zero character at the end of the string, means the end of the data. Thus, the string is simply truncated.
Вот ещё вдогонку, советы дебилов с того же программерса:
http://www.programmersforum.ru/showthread.php?t=5857
Особенно умилил пост:
"а можно и еще проше
Код:
Pointer(sArray):= Pointer(sString);
ShowMessage(pchar(sArray));
"
Не переманивай моих поцев, своих надо иметь.
Кто ты?
говёненький API надо сказать
Не могу оценить.
Ты знаешь, что делать.
Функция SHGetSpecialFolderPath не умеет возвращать длину строки (пусть в нашей фантастической PHPOS она возвращает строку 's::"C:\Windows";'). Нам нужно эту длину посчитать и подставить.
В решении, предложенном Бараком Хусейновичем, StrLen получает из этой строки длину (в данном примере 10), а SetLength вставляет это число в сериализацию.
SHGetFolderPathA Deprecated. Gets the path of a folder identified by a CSIDL value.
сепульки ебучие
Retrieves the full path of a known folder identified by the folder's KNOWNFOLDERID.
Майкрософт вообще славится своей совместимостью, так что, вызывать и юзать депрекатед-апи не так страшно, как может показаться.
это да. У них в shimах (compatibility manager) там чуть-ли не игрухи есть
21 minutes to read
The KNOWNFOLDERID constants represent GUIDs that identify standard folders registered with the system as Known Folders.
FOLDERID_AccountPictures
GUID {008ca0b1-55b4-4c56-b8a8-4de4b299d3be}
Default Path %APPDATA%\Microsoft\Windows\AccountPictures
https://docs.microsoft.com/en-us/windows/desktop/shell/knownfolderid
Святые негодники, да на кой хуй всё это надо?
На пустом совершенно месте раздули целый, блядь, фреймворк.
Пути ебанутые совершенно
Вот это охуенно
FOLDERID_MusicLibrary
%APPDATA%\Microsoft\Windows\Libraries\Music.library-ms
Кто этим пользуется? Кто, Блядь, этим вообще пользуется? У всех музыка лежит на d:\music, и слушают ее винампом.
Нахуй нужна папка "music library"?
Или вот например
FOLDERID_ProgramFiles
Угадайте, какой у нее путь?
А правильно: %ProgramFiles% (%SystemDrive%\Program Files)
Какой еблан будет хранить Program Files в папке, отличной от %ProgramFiles%?
Почему в позиксах все знают что в /bin/sh лежит борн ш?
Почему, блядь, там нету
FOLDERID_Bin с GUID {905e63b6-c1bf-494e-b29c-65b732d3d21a}?
А скажем вот
Independent software vendors (ISVs) can extend the set of Known Folder IDs with their own. They can define folders, give them IDs, and register them with the system. CSIDL values could not be extended.
Сука, я ISV, я могу FOLDERID_Pron зарегить?
Я уже и свой guidgen.exe достал
Да. И я уже где-то писа́л, что ограничение на длину переменной PATH в «Windows 10» такое же, как в «Windows 2000». За 18 лет ничего не изменилось. На «Windows» упала стабильность.
> Какой еблан будет хранить Program Files в папке, отличной от %ProgramFiles%?
С этим согласен. Другое дело, что иногда приходится устанавливать программу не в Program Files либо чтобы уложиться в ограничение на длину PATH, либо потому что позиксовая хрень не любит пробелы в директориях.
> Почему в позиксах все знают что в /bin/sh лежит борн ш?
Потому что винда — это винда, а позикс — это позикс. Кстати, в винде был свой позикс, только он оказался не нужен.
А вообще да, не хватает какой-нибудь стандартной директории, перечисленной в PATH (кроме System32), в которую можно кидать исполнимые файлы.
> FOLDERID_MusicLibrary
А это чтобы "Windows" случайно расшаривали по локалке папку с музыкой и все слушали и текли.
facepalm
Это код на делфи!