- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
kir_rik 08.10.2018 10:31 # −104
BagorCtretora 08.10.2018 10:33 # −4
Lorip1971 08.10.2018 12:27 # −3
Steve_Brown 08.10.2018 13:16 # −2
BagorCtretora 08.10.2018 13:44 # 0
Кстати, третий минус я сам себе вдрючил. Слегка шокирован.
guest8 08.10.2018 15:35 # −999
DOKTOPuHXO 08.10.2018 15:46 # +1
Ловко это ты... Чтобы никто не подумал, что это твоя файка...
Далеко пойдёшь.
BagorCtretora 08.10.2018 15:47 # +1
DOKTOPuHXO 08.10.2018 15:52 # +1
BagorCtretora 08.10.2018 15:53 # +1
guest8 08.10.2018 15:48 # −999
Goh 08.10.2018 15:56 # +1
Straiker 08.10.2018 23:01 # +1
guest8 08.10.2018 15:28 # −999
BETEP 09.10.2018 19:58 # +2
Кстати, а в чём ошибка? Почему не происходит конкатенация?
OBEH 09.10.2018 20:05 # −5
Что за дебильное слово? Почему не "контактация" (логично - контакт двух строк)?
guest8 09.10.2018 20:08 # −999
OBEH 09.10.2018 20:12 # −5
guest8 09.10.2018 20:17 # −999
guest8 09.10.2018 20:19 # −999
Barak_Obama 09.10.2018 20:08 # +4
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.
BETEP 09.10.2018 20:14 # +3
Barak_Obama 09.10.2018 20:21 # +4
BagorCtretora 09.10.2018 20:47 # +2
Вот ещё вдогонку, советы дебилов с того же программерса:
http://www.programmersforum.ru/showthread.php?t=5857
Особенно умилил пост:
"а можно и еще проше
Код:
Pointer(sArray):= Pointer(sString);
ShowMessage(pchar(sArray));
"
OBEH 09.10.2018 20:56 # −2
BagorCtretora 09.10.2018 21:11 # +1
DOKTOPuHXO 09.10.2018 21:13 # −1
Не переманивай моих поцев, своих надо иметь.
BagorCtretora 09.10.2018 21:15 # 0
Кто ты?
guest8 09.10.2018 21:16 # −999
rHujlou_xyu 09.10.2018 21:21 # −99
kir_rik 09.10.2018 21:19 # −100
guest8 09.10.2018 21:21 # −999
bormand 09.10.2018 21:24 # 0
guest8 13.10.2018 04:44 # −999
OBEH 13.10.2018 05:56 # 0
Не могу оценить.
Ты знаешь, что делать.
rHujlou_xyu 09.10.2018 21:25 # −99
kir_rik 09.10.2018 21:18 # −103
paul 09.10.2018 21:20 # −1
PAAMAYIM_NEKUDOTAYIM 13.10.2018 04:26 # −1
Функция SHGetSpecialFolderPath не умеет возвращать длину строки (пусть в нашей фантастической PHPOS она возвращает строку 's::"C:\Windows";'). Нам нужно эту длину посчитать и подставить.
В решении, предложенном Бараком Хусейновичем, StrLen получает из этой строки длину (в данном примере 10), а SetLength вставляет это число в сериализацию.
guest8 13.10.2018 04:42 # −999
guest8 13.10.2018 12:25 # −999
guest8 13.10.2018 04:44 # −999
guest8 13.10.2018 12:20 # −999
guest8 13.10.2018 12:22 # −999
guest8 13.10.2018 12:23 # −999
DOKTOPuHXO 13.10.2018 23:01 # +4
Майкрософт вообще славится своей совместимостью, так что, вызывать и юзать депрекатед-апи не так страшно, как может показаться.
guest8 14.10.2018 02:04 # −999
guest8 14.10.2018 04:57 # −999
guest8 14.10.2018 12:10 # −999
guest8 14.10.2018 12:43 # −999
guest8 14.10.2018 13:26 # −999
guest8 14.10.2018 14:29 # −999
guest8 14.10.2018 14:30 # −999
guest8 14.10.2018 15:22 # −999
Support 21.11.2022 22:03 # 0
bogdan_stojakovich 24.11.2022 20:38 # 0
guest8 09.10.2018 20:10 # −999
Barak_Obama 09.10.2018 20:29 # +4
CBuHOKYP 04.10.2021 00:49 # 0
guest8 14.10.2018 14:25 # −999
guest8 14.10.2018 14:28 # −999
guest8 14.10.2018 14:28 # −999
guest8 14.10.2018 14:29 # −999
DOKTOPuHXO 14.10.2018 14:43 # +2
Это код на делфи!
guest8 14.10.2018 14:49 # −999
DOKTOPuHXO 14.10.2018 14:58 # +2