Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.18;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.043 c
3-1087809125
AVKAR
2004-06-21 13:12
2004.07.18
Обновление строки


3-1087539902
min
2004-06-18 10:25
2004.07.18
sql-Delphi


1-1089003161
ai
2004-07-05 08:52
2004.07.18
Quick Report: как изменять разрешение при печати?


14-1088207366
Soft
2004-06-26 03:49
2004.07.18
Книги по 2D графике?


3-1087464293
kalishenko
2004-06-17 13:24
2004.07.18
Поле типа float фикс. размера (12,2).