Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.036 c
1-1088597647
phantom
2004-06-30 16:14
2004.07.18
Редактирование памяти


3-1088079522
Oleon
2004-06-24 16:18
2004.07.18
Какой грид может помочь вывести данные в таком виде?


6-1085218415
trix
2004-05-22 13:33
2004.07.18
Как сменить сетевую итендификацию ?


14-1087899879
skiFF
2004-06-22 14:24
2004.07.18
Жди беды?


3-1087857148
Oxer
2004-06-22 02:32
2004.07.18
DBChart





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский