Перейдем к рассмотрению функции закрытия открытого ресурса. Добавим в паше приложение еще одну кнопку, и по ее нажатии нужно написать код из листинга 5.19.

Листинг 5.19. Код закрытия открытого ресурса

procedure TForml.bnDeleteClick(Sender: TObject): var sShareName: String; Name9x: array [0..12] of Char: NameNT: PWChar. begin if lbSharesList.Itemlndex = -1 then begin ShowMessage('Выдели шару, которую надо закрыть'): exit.

end:
sShareName := lbSharesList.Items.Strings[lbSharesList Itemlndex];

if bNT then begin // Далее идет код для NT-систем

@NetShareDelNT := GetProcAddressCfHandleNT. 'NetShareDeT):
if @NetShareDelNT = nil then
exit;

// Конвертация в Wide Char GetMemCNameNT. WIDE_LENGTH): StringToWideChar(sShareName. NameNT, WIDE_LENGTH):

NetShareDelNT(nil. NameNT. 0);
FreeMem(NameNT);

end else begin // Далее идет код для 9х-систем

@NetShareDel := GetProcAddress(fHandle9x. 'NetShareDeT);
if @NetShareDel = nil then
exit;
FillChar(Name9x. Size0f(Name9x). #0): move(sShareName[l]. Name9x[0], Length(sShareName));
NetShareDeKnil. (?Name9x.u);
end;
dnListSharesClick(nil);
end.

Я думаю, что вам уже надоело рассматривать однообразный код поиска нужной процедуры в библиотеке, но ог этого никуда не деться. Мы могли найти все процедуры при старте программы, а здесь только использовать, но это невыгодно, потому что пользователь может запустить программу один раз и тут же выйти из нее, и тогда поиск при старте будет бессмыслен.

Когда пользователь регулярно работает с программой и постоянно добавляет, удаляет или просматривает ресурсы, то производить поиск при каждом вызове нерационально (из-за повторения операций). Гораздо лучше найти все функции и сохранить их адреса в свои переменные при старте.

Для закрытия открытого ресурса необходимо знать его имя. Пользователь должен перечислить все, что открыто на данный момент, выделить в списке нужный ресурс и нажать кнопку удаления. Мы же определяем, что выделено.

Если пользователь ничего не выбрал (lbSharesList.Itemlndex равно -1), то выводим соответствующее сообщение и выходим, потому что удалять будет нечего и произойдет ошибка. При наличии выделенного элемента определяем его имя:

sShareName := 1 bSharesList.Items.StringsH bSharesList.Itemlndex]: Далее код разделяется для NT- и Эх-систем, но, как и раньше, оба случая схожи. Разница состоит в том, что для NT-систем имя удаляемого ресурса переводится в формат Unicode.

Сначала определяем адрес нужной функции в загруженной динамической библиотеке. Далее строки преобразовываются уже знакомым нам способом, происходит вызов функции NetShareDelNT (для NT-систем) или NetShareDel (для 9х-систем), которая и производит удаление. Функция NetShareDelNT описывается следующим образом:

function NetShareDelNT(
ServerName. PWideChar;
NetName: PWideChar;
Reserved: DWORD ): Longlnt;
stdcall;

Для Windows 9x объявление отличается только типом строк:

function NetShareDel(
pszServer, pszNetName: PChar:
usReserved: Word ): DWORD: stdcall;

Рассмотрим параметры функции NetShareDel NT, для NetShareDel они имеют аналогичное значение:

• ServerName - имя сервера, на котором нужно произвести закрытие открытого ресурса;
• NetName - имя удаляемого ресурса;

• Reserved - зарезервировано.

В последнем параметре лучше указывать 0 и воспринимать как константу. Хотя он зарезервирован, использовать его уже не будут, потому что данные функции позабыты программистами Microsoft, несмотря на их простоту и удобство, даже с учетом отличий в реализации для разных систем.

ПРИМЕЧАНИЕ -

Исходный код рассмотренного здесь примера находится на компакт-диске в каталоге 5оигсе5\сп05\№1Ар13.

5.8.3. Перечисление общих ресурсов || Оглавление || 5.9. Мониторинг сетевой активности


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31