Освобождение памяти.

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Освобождение памяти.

Сообщение fwp » 10.06.2009 15:41:22

Код: Выделить всё
var
  pHost   : PWChar;
...
  GetMem(pHost,512);
    ...
  FreeMem(pHost);

Строка FreeMem(pHost) вызывает ошибку.

Добавлено спустя 10 минут 3 секунды:
ДА, в дельфях код работает.
fwp
новенький
 
Сообщения: 29
Зарегистрирован: 25.03.2008 12:00:06

Re: Освобождение памяти.

Сообщение Mr.Smart » 10.06.2009 16:03:14

Что вы делаете с переменной между вызовов GetMem(pHost,512) и FreeMem(pHost);?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Освобождение памяти.

Сообщение fwp » 10.06.2009 16:48:39

Mr.Smart писал(а):Что вы делаете с переменной между вызовов GetMem(pHost,512) и FreeMem(pHost);?

Спасибо, как ни странно, но ваш вопрос натолкнул меня на причину ошибки.
Вот полный текст функции:
Код: Выделить всё
procedure TForm1.btnShareClick(Sender: TObject);
var
  A             : PShareInfo2Array;
  e,te         : DWORD;
  pHost       : PWChar;
  i              : Integer;

begin
  if (IsInit < 0) then begin
    exit;
  end;
  @NetShareEnum := GetProcAddress(hLibrary,'NetShareEnum');
  if (NOT Assigned(NetShareEnum)) then begin
    exit;
  end;
  GetMem(pHost,512);
  StringToWideChar(Trim(edHost.Text),pHost,512);
  if (NetShareEnum(pHost,2,@A,DWORD(-1),@e,@te,NIL) <> 0) then begin
    MessageBox(0,' <<<  ERROR!!!  >>> ','ВНИМАНИЕ',MB_ICONHAND);
    FreeMem(pHost);
    exit;
  end;
  if (e > 0) then begin
    for i := 0 to e - 1 do begin
      M.Lines.Add(String(A^[i].netname));
    end;
  end;
  FreeMem(pHost);
end;

Освобождение памяти проходит нормально.
Но вот строка StringToWideChar(Trim(edHost.Text),pHost,512) не срабатывает так как в дельфях. И вызов функции NetShareEnum() проходит по ошибке. Тогда я вставил pHost := 'myComputer'. NetShareEnum() стал отрабатывать нормально, а FreeMem() выдавать ошибку.
Буду разбираться со строковыми типами... М.б. вы что подскажите?
fwp
новенький
 
Сообщения: 29
Зарегистрирован: 25.03.2008 12:00:06

Re: Освобождение памяти.

Сообщение Mr.Smart » 10.06.2009 17:03:21

Попробуйте так
Код: Выделить всё
var
Host: WideString;
....
Host:=UTF8Decode(Trim(edHost.Text));
if (NetShareEnum(PWideChar(Host),.......
....
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Освобождение памяти.

Сообщение Max Rusov » 10.06.2009 21:44:00

fwp писал(а):М.б. вы что подскажите?


Ну, минимум, памяти нужно выделять в 2 раза больше.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Освобождение памяти.

Сообщение fwp » 18.06.2009 09:44:33

Mr.Smart писал(а):Попробуйте так
Код: Выделить всё
var
Host: WideString;
....
Host:=UTF8Decode(Trim(edHost.Text));
if (NetShareEnum(PWideChar(Host),.......
....

Спасибо! Вроде работает.
Самое интересное, что я так первоначально делал в дельфях. Но там это не сработало, пришлось бодаться с PWChar.
fwp
новенький
 
Сообщения: 29
Зарегистрирован: 25.03.2008 12:00:06


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru