- 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
Кстати, третий минус я сам себе вдрючил. Слегка шокирован.
Ловко это ты... Чтобы никто не подумал, что это твоя файка...
Далеко пойдёшь.
Кстати, а в чём ошибка? Почему не происходит конкатенация?
Что за дебильное слово? Почему не "контактация" (логично - контакт двух строк)?
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));
"
Не переманивай моих поцев, своих надо иметь.
Кто ты?
Не могу оценить.
Ты знаешь, что делать.
Функция SHGetSpecialFolderPath не умеет возвращать длину строки (пусть в нашей фантастической PHPOS она возвращает строку 's::"C:\Windows";'). Нам нужно эту длину посчитать и подставить.
В решении, предложенном Бараком Хусейновичем, StrLen получает из этой строки длину (в данном примере 10), а SetLength вставляет это число в сериализацию.
Майкрософт вообще славится своей совместимостью, так что, вызывать и юзать депрекатед-апи не так страшно, как может показаться.
Это код на делфи!