Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заполнение памяти при использовании NetFileEnum 
V
    Опции темы
l1fe
Дата 10.2.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.2.2009

Репутация: нет
Всего: нет



Почитав известную статью "Мониторинг сетей в делфи" (отсюда), делаю программу мониторинга открытых через сеть файлов.....
Код

procedure TMainForm.suitempbtnGetFilesClick(Sender: TObject);
var
  OS: Boolean;
  FLibHandle : THandle;
  FileInfoNT: PFileInfo3Array;
  FileInfo9x: array [0..512] of TFileInfo50;
  TotalEntries,EntriesReadNT: DWORD;
  EntriesRead,TotalAvial: Word;
  i:integer;
begin
  lvfiles.Items.Clear;

  if not IsNT(OS) then Close; //Выясняем тип системы

  if OS then begin  //Код для NT
    FLibHandle := LoadLibrary('NETAPI32.DLL');
    if FLibHandle = 0 then Exit;
    @NetFileEnumNT := GetProcAddress(FLibHandle, 'NetFileEnum');
    if not Assigned(NetFileEnumNT) then
    begin
      FreeLibrary(FLibHandle);
      Exit;
    end;
    FileInfoNT := nil;
    if NetFileEnumNT(nil,nil,nil,3,@FileInfoNT,DWORD(-1),@entriesreadNT, @totalentries, nil)=0 then
    for i:=0 to EntriesReadNT-1 do
    begin
      with lvFiles.Items.Add do  //Заполнение данными из структуры
      begin
        Caption := string(IntToStr(FileInfoNT^[i].fi3_id)); //Идентификатор
        SubItems.Add(FileInfoNT^[i].fi3_pathname);   //Путь к файлу
        SubItems.Add(FileInfoNT^[i].fi3_username);   //Имя пользователя
      end;
    end;
  end else begin //Код для Windows 9x-Me
   FLibHandle := LoadLibrary('SVRAPI.DLL');
   if FLibHandle = 0 then Exit;
   @NetFileEnum := GetProcAddress(FLibHandle, 'NetFileEnum');
    if not Assigned(NetFileEnum) then
    begin
      FreeLibrary(FLibHandle);
      Exit;
    end;
   if NetFileEnum (nil, nil,50,@FileInfo9x,SizeOf(FileInfo9x),@EntriesRead,@TotalAvial)= 0 then
   for i:=0 to EntriesRead-1 do
   begin
      with lvFiles.Items.Add do  //Заполнение данными из структуры
      begin
        Caption := string(IntToStr(FileInfo9x[i].fi50_id)); //Идентификатор
        SubItems.Add(FileInfo9x[i].fi50_pathname); //Путь к файлу
        SubItems.Add(FileInfo9x[i].fi50_username); //Имя пользователя
      end;
   end;
 end;
 FreeLibrary(FLibHandle);
end;
 

 Эту процедуру вызываю при помощи таймера ,допустим раз в секунду - но проблема в том что при этом  идёт постоянное заполнение оперативной памяти, до тех пор пока не забьётся всё =(
 Отключал таймер в самой процедуре а потом включал, очищал  переменные используемые в NetFileEnum, использовал очистку буфера - не помогает, каждый такт таймера при выполнении память пожирается, без последующего восстановления.....
 Увеличение интервала таймера также не помогло... Причём даже при одном открытом файле память также сжирается.
 Программу тестировал на Windows NT и XP - под Windows 9x-Me не проверял.
Собственно и вопрос, уважаемые "Почему оперативная память сжирается?" ^^


Это сообщение отредактировал(а) l1fe - 10.2.2009, 18:08
PM MAIL   Вверх
Quartz
Дата 16.2.2009, 07:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 28.6.2008

Репутация: нет
Всего: 4



Цитата(l1fe @  10.2.2009,  18:02 Найти цитируемый пост)
использовал очистку буфера - не помогает

Что значит "очистка буфера"? NetApiBufferFree нужно вызывать.

Цитата
bufptr [out] 
Pointer to the buffer that receives the data. The format of this data depends on the value of the level parameter.
This buffer is allocated by the system and must be freed using the NetApiBufferFree function. Note that you must free the buffer even if the function fails with ERROR_MORE_DATA.

Windows Me/98/95:  The caller must allocate and deallocate this buffer.

PM MAIL   Вверх
l1fe
Дата 26.2.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.2.2009

Репутация: нет
Всего: нет



Quartz, под "очисткой буфера" как и понимал эту функцию, а не работала у меня из-за неправильного обьявления-использования....
после...
Код

function NetApiBufferFree(Buffer:Pointer):DWORD;stdcall;external 'Netapi32.dll' Name 'NetApiBufferFree';


очищал FileInfoNT^[i] (FileInfo9x[i]), этой функцией и память переставала пожираться.
 
Quartz, всё равно спасибо)

вот только странно что в данной статье этого нет =(

Это сообщение отредактировал(а) l1fe - 26.2.2009, 14:26
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0441 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.