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

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

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

Ответить
fwp
новенький
Сообщения: 29
Зарегистрирован: 25.03.2008 11:00:06

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

Сообщение fwp »

Код: Выделить всё

var
  pHost   : PWChar;
...
  GetMem(pHost,512);
    ...
  FreeMem(pHost);

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

Добавлено спустя 10 минут 3 секунды:
ДА, в дельфях код работает.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Что вы делаете с переменной между вызовов GetMem(pHost,512) и FreeMem(pHost);?
fwp
новенький
Сообщения: 29
Зарегистрирован: 25.03.2008 11:00:06

Сообщение fwp »

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() выдавать ошибку.
Буду разбираться со строковыми типами... М.б. вы что подскажите?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Попробуйте так

Код: Выделить всё

var
 Host: WideString;
....
 Host:=UTF8Decode(Trim(edHost.Text));
 if (NetShareEnum(PWideChar(Host),.......
....
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

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


Ну, минимум, памяти нужно выделять в 2 раза больше.
fwp
новенький
Сообщения: 29
Зарегистрирован: 25.03.2008 11:00:06

Сообщение fwp »

Mr.Smart писал(а):Попробуйте так

Код: Выделить всё

var
 Host: WideString;
....
 Host:=UTF8Decode(Trim(edHost.Text));
 if (NetShareEnum(PWideChar(Host),.......
....

Спасибо! Вроде работает.
Самое интересное, что я так первоначально делал в дельфях. Но там это не сработало, пришлось бодаться с PWChar.
Ответить