> Я вообщето в курсе, что такое PChar, и что подочто надо > выделять > > > Function GetWindowsDir: String; > > Begin > > //Заставляем компилер выделить память в строку... > > SetLength(Result, MAX_PATH); > > //Помедитируй немного над этой строкой > > SetLength(Result, > GetWindowsDirectory(PChar(Result), > > MAX_PATH+1)); > > //Всё, и нет велосипеда ;-) > > End; > > С получением GetWindowsDirectory у меня велосипедов нет > (Хотя у себя я не выделял память под PChar, т.к., не > поверешь, с выделением он мне не возвращает ровным счетом > ничего, кроме @#$ни какойто и к стате твой пример тоже не > работает). Вот потом идут глюки. И опять же проверял дома > подобную штуку - все работает, на работе нифига. > Может что с тачилой? (i845G шатл + celeron 1.7, 128DDR + > 98-е), она еще любит сама по себе перегружаться. Интересно, а у тебя что раньше вопросов не возникало, почему это тачка сама по себе перегружается. Думаю лучше оторваться на некоторое время от программирования и потестить тачилу, например память и проц,
а то скоро даже программа hello world перестанет выполняться :-)
Делаю премерно такую фигню
dir:='';
getwindowsdirectory(dir,MAX_PATH);
StrDir:=string(dir);
StrDir:=''StrDir'\notepad.exe';
После чего в StrDir возвращает груду мусора.
dir объявлял как и Pchar и array [1..max_path] of char, одна фигня.
Еще интересней:
после getwindowsdirectory(dir,MAX_PATH);
получаю dir='C:\WINDOWS', делаю StrDir:=string(dir); dir:=pchar(strdir) и имею
значение dir вместо 'C:\WINDOWS' чуть другое dir='C:\WJNDOWS' (вместо i стоит j). Тут я вообще не въехал.
А конкатенацию делал и через + и через concat, одна фигня.
Потом просто проверил без PChar-ов со стрингами, типа strdir:='aaa'+'bbb' - дает мусор. :(
Получается нормально только если сначала strdir:='aaa'+'bbb' , а потом str='zzzz'+'xxx' и во второи случае получаю все нормально :).
Глюк?
[delphi] Вот только не надо велосипедов ;-)23.04.03 03:53 Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 23.04.03 04:13 Количество правок: 2
> Делаю премерно такую фигню > dir:=''; > getwindowsdirectory(dir,MAX_PATH); > StrDir:=string(dir); > StrDir:=''StrDir'\notepad.exe'; > После чего в StrDir возвращает груду мусора. > dir объявлял как и Pchar и array [1..max_path] of char, > одна фигня.
Что-то у тебя всё фигня, да фигня ;-))) Не надо юзать PChar, если не знаешь как его юзать. Этож память надо под него выделять, потом с ним (с PChar) работать корректно, потом не забыть память освободить... ANSI string можно и даже нужно юзать для системных вызовов, компилер сам за тобой всё подотрёт. Итак, вот пример проги, для тебя эксклюзивно писанной ;-)...
Program NewProg;
{$APPTYPE CONSOLE}
Uses Windows;
Function GetWindowsDir: String;
Begin
//Заставляем компилер выделить память в строку...
SetLength(Result, MAX_PATH);
//Помедитируй немного над этой строкой
SetLength(Result, GetWindowsDirectory(PChar(Result), MAX_PATH+1));
//Всё, и нет велосипеда ;-)
End;
// А вот на PChar, но больше гемора. Зачем работать за компилер?
Function GetWindowsDir2: String;
Var aStr: PChar;
Begin
GetMem(aStr, MAX_PATH + 1);
GetWindowsDirectory(aStr, MAX_PATH + 1);
Result := aStr;
FreeMem(aStr);
End;
Function GetOEMString(Const aStr: String): String;
Begin
Result := aStr;
//Ты слышал что-нибудь про то, что string он немножко того, reference-counted?
//Если нет, то помедитируй и над этой строкой (ниже),
UniqueString(Result); //И подумай над тем, чтобы было бы, если бы её не было ;-)
ANSItoOEM(PChar(Result), PChar(Result));
End;
Begin
WriteLn(GetWindowsDir + GetOEMString(' - Моя конкатенация работает ;-))))))'));
WriteLn(GetWindowsDir2 + GetOEMString(' - И эта работает ;-))))))'));
End.
---
[delphi] У меня самокат! :)23.04.03 09:02 Автор: ASJinx Статус: Незарегистрированный пользователь
Я вообщето в курсе, что такое PChar, и что подочто надо выделять
> Function GetWindowsDir: String; > Begin > //Заставляем компилер выделить память в строку... > SetLength(Result, MAX_PATH); > //Помедитируй немного над этой строкой > SetLength(Result, GetWindowsDirectory(PChar(Result), > MAX_PATH+1)); > //Всё, и нет велосипеда ;-) > End;
С получением GetWindowsDirectory у меня велосипедов нет (Хотя у себя я не выделял память под PChar, т.к., не поверешь, с выделением он мне не возвращает ровным счетом ничего, кроме @#$ни какойто и к стате твой пример тоже не работает). Вот потом идут глюки. И опять же проверял дома подобную штуку - все работает, на работе нифига.
Может что с тачилой? (i845G шатл + celeron 1.7, 128DDR + 98-е), она еще любит сама по себе перегружаться.
[delphi] А попробуй ка ты потестить свой самокат! :-)23.04.03 16:34 Автор: Cyril <sc> Статус: Member
> Я вообщето в курсе, что такое PChar, и что подочто надо > выделять > > > Function GetWindowsDir: String; > > Begin > > //Заставляем компилер выделить память в строку... > > SetLength(Result, MAX_PATH); > > //Помедитируй немного над этой строкой > > SetLength(Result, > GetWindowsDirectory(PChar(Result), > > MAX_PATH+1)); > > //Всё, и нет велосипеда ;-) > > End; > > С получением GetWindowsDirectory у меня велосипедов нет > (Хотя у себя я не выделял память под PChar, т.к., не > поверешь, с выделением он мне не возвращает ровным счетом > ничего, кроме @#$ни какойто и к стате твой пример тоже не > работает). Вот потом идут глюки. И опять же проверял дома > подобную штуку - все работает, на работе нифига. > Может что с тачилой? (i845G шатл + celeron 1.7, 128DDR + > 98-е), она еще любит сама по себе перегружаться. Интересно, а у тебя что раньше вопросов не возникало, почему это тачка сама по себе перегружается. Думаю лучше оторваться на некоторое время от программирования и потестить тачилу, например память и проц,
а то скоро даже программа hello world перестанет выполняться :-)
> > а то скоро даже программа hello world перестанет выполняться :-) Пошутил, да?
А на счет тестов ты прав, запустил сандру 2002, непошла, висим и т.д. Перезагрузка, повторный запуск - ошибка там и там, до скорых встречь. На соседних компах идет, тут нет. Завтра молот принесу, никто возражать не будет, все равно все дерьмо. (хотя похоже ддрка глючит)
А на счет суммы двух стрингов - мусор.
сумма двух PChar'ов == указатель на мусор24.04.03 21:09 Автор: Killer{R} <Dmitry> Статус: Elderman
> Делаю премерно такую фигню > dir:=''; > getwindowsdirectory(dir,MAX_PATH); > StrDir:=string(dir); > StrDir:=''StrDir'\notepad.exe'; > После чего в StrDir возвращает груду мусора. > dir объявлял как и Pchar и array [1..max_path] of char, > одна фигня. > > Еще интересней: > после getwindowsdirectory(dir,MAX_PATH); > получаю dir='C:\WINDOWS', делаю StrDir:=string(dir); > dir:=pchar(strdir) и имею > значение dir вместо 'C:\WINDOWS' чуть другое > dir='C:\WJNDOWS' (вместо i стоит j). Тут я вообще не > въехал. > > А конкатенацию делал и через + и через concat, одна фигня. > Потом просто проверил без PChar-ов со стрингами, типа > strdir:='aaa'+'bbb' - дает мусор. :( > Получается нормально только если сначала > strdir:='aaa'+'bbb' , а потом str='zzzz'+'xxx' и во второи > случае получаю все нормально :). > Глюк? Чтобы сказать есть ли у тебя глюк в процедуре или нет
хотелось бы взглянуть на полностью функциональный пример
с нормально объявленными переменными, посмотреть как ты
проверяешь значения, как выделяешь память под строки и. т. д.
а то очень тяжело отвечать на вопросы:
у всех 2+2=4 а у меня 2+2 = 5, Глюк ???
// например вот этот пример должен замечательно работать
procedure TForm1.Button1Click(Sender: TObject);
var
strdir : string;
begin
strdir := 'aaa'+'bbb';
ShowMessage(strdir);
strdir := 'zzz'+'xxx';
showmessage(strdir);
end;