Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
ВнизPAnsiChar и GetShortPathName Найти похожие ветки
← →
TUser © (2004-07-04 21:36) [0]Достаточно ли при использовании PAnsiChar сказать ему New и Dispose. Раньше, вроде делал именно так, проблем не было. Сейчас использую ф-цию GetShortPathName, уже даже не знаю, как еще с памятью обойтись. Код такой
var s1,s2:PAnsiChar;
begin
{выделяем память под s1 и s2}
...
s1:=PAnsiChar(str);
GetShortPathName(s1,s2,100);
str:=s2;
finally
{освобождаем память}
end;
end;
Если писать New и Dospose, то GetShortPathName падает сразу. получается AV. При попытке выйти из программы - еще AV и Run time error (бывает 216 и 217). Можно уменьшить кол-во таких глюков, я пробовал использовать GetMem/FreeMem, AllocateMem, Realloc, вобщем уже пытаюсь все что под руку поападается. Как правильно реализовать это дело?
← →
Fay (2004-07-04 21:37) [1]GetMem
FreeMem
← →
GuAV © (2004-07-04 21:46) [2]
> New и Dospose
New(PStructrue) выделит объём sizeof(TStructure)
Dispose(PStructrue) освободит объём sizeof(TStructure)
New(PChar) - sizeof(Car0 - один байт - тебе хватит? :-))
← →
GuAV © (2004-07-04 21:47) [3]
> sizeof(Car0
sizeof(Char)
← →
GuAV © (2004-07-04 21:53) [4]
> Как правильно реализовать это дело?
Сначала спросить GetShortPathName(s1,nil,0) - результат+1 - скока надо выделить - это число будет параметр GetMem и Freemem
← →
TUser © (2004-07-04 22:19) [5]Спасибо, попробовал. Правда все равно не помогло. Например, такой кусок кода
function ...
function GetSN(LN:string):string;
var ac1,ac2:PAnsiChar;
s:string;
i:integer;
begin
s:=extractfilepath(LN);
GetMem(ac1,length(s)+1);
ac1:=PAnsiChar(s);
i:=GetShortPathName(ac1,nil,0);
GetMem(ac2,i+1);
GetShortPathName(ac1,ac2,i);
result:=ac2+extractfilename(LN);
FreeMem(ac1);
FreeMem(ac2);
end;
begin
Str1:=GetSN(Arch.Path);
Str2:=GetSN(extractfilepath(paramstr(0))+"..."+GetFileName(Name,false));
if not Fileexists(Str2) then begin
...
end else result:=true;
На Str1 падает. Если защитить GetSN try"ем, то на Str2 все происходит нормально, но при попытке присвоить result:=true в конце основной ф-ции возникает AV.
Чертовщина какая-то. Отладчик перед этим AV пробегает по модулям из библиотеки ICS. Раньше никаких проблем с ней не было. Вообще с проектом что-то не то творится ...
← →
TUser © (2004-07-04 22:39) [6]Почему-то именно FreeMem портит мне жизнь. Вот такой код сдалал
procedure TForm1.Go;
var s:string;
s1,s2:PAnsiChar;
i:integer; j:integer;
begin
s:=Edit1.Text;
if DirectoryExists(s) then begin
j:=length(s);
GetMem(s1,j+1);
s1:=PAnsiChar(s);
i:=GetShortPathName(s1,nil,0);
GetMem(s2,i+1);
GetShortPathName(s1,s2,i);
s:=s2;
Label1.Caption:=s;
// FreeMem(s1{,j+1}); FreeMem(s2{,i+1});
if not DirectoryExists(s) then
raise Exception.Create("Short path not found");
end else raise Exception.Create("Long path not found");
end;
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
if SelectDirectory(s,[],0) then begin
Edit1.Text:=s;
Go;
end;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
Label1.Caption:="";
if key = #13 then
Go;
end;
Если FreeMem убрать - то все работает нормально, если не убирать - глючит. В основном проекте аналогично. Но ведь память-то надо как-то освобождать.
← →
jack128 © (2004-07-04 22:40) [7]
> GetMem(ac1,length(s)+1);
> ac1:=PAnsiChar(s);
здесь мем лик
> FreeMem(ac1);
здесь попытка освободить битый указатель..
← →
Anatoly Podgoretsky © (2004-07-04 23:28) [8]GetMem(ac1,length(s)+1);
ac1:=PAnsiChar(s);
Потерял AC1
Для него не надо ни выделять, ни освобождать память, да и сам ac1 лишний
← →
GuAV © (2004-07-04 23:52) [9]Во-первых, согласен со всеми замечаниями.
Во-вторых +1 выкинуть. меня подвело на него:
If the function succeeds, the return value is the length, in characters, of the string copied to lpszShortPath, not including the terminating null character.
но это If the function succeeds
а так возвращает размер буфера.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.032 c