Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

DLL - убийственная утилита

Delphi , Файловая система , DLL и PlugIns

DLL - убийственная утилита

Программа МсLаud.ехе вызвала неустранимую ошибку в модуле kukushkа.dll при обращении к системному таймеру: Stасk Оvеrflоw. Кukushkа.dll будет закрыта. При повторном появлении ошибки обратитесь к разработчику МсLаud.ехе.

Вот маленький метод, взятый мною из небольшого проекта, созданного мною для удаления DLL из памяти. На форме присутствует одно поле редактирования TEdit с именем EditDLLName, кнопки Ok и Close. Следующий код выполняется при нажатии на кнопке Ok:


procedure TForm1.OkBtnClick(Sender: TObject);
var
  hDLL: THandle;
  aName: array[0..10] of char;
  FoundDLL: Boolean;
begin
  if EditDLLName.Text = '' then
  begin
    MessageDlg('Сначала вы должны ввести имя выгружаемой DLL!', mtInformation,
      [mbOk], 0);
    exit;
  end;
  StrPCopy(aName, EditDLLName.Text);
  FoundDLL := false;
  repeat
    hDLL := GetModuleHandle(aName);
    if hDLL = 0 then
      break;
    FoundDLL := true;
    FreeLibrary(hDLL);
  until false;
  if FoundDLL then
    MessageDlg('Успешно!', mtInformation, [mbOk], 0)
  else
    MessageDlg('DLL не найдена!', mtInformation, [mbOk], 0);
  EditDLLName.Text := '';
end;

Here's the translation of the content into Russian:

Неплохой маленький инструмент для выгрузки DLL из памяти!

Код, который я предоставил, является частью проекта, созданного Microsoft (MSLaud.exe), который встречает необработанный ошибку в модуле kukushka.dll при попытке доступа к системному таймеру. Ошибка сообщает, что kukushka.dll будет закрыта, и если ошибка persists, пользователь должен связаться с разработчиком MSLaud.exe.

Теперь давайте более подробно рассмотрим ваш маленький метод:

procedure TForm1.OkBtnClick(Sender: TObject);
var
  hDLL: THandle;
  aName: array[0..10] of char;
  FoundDLL: Boolean;
begin
  if EditDLLName.Text = '' then
  begin
    MessageDlg('Сначала вы должны ввести имя выгружаемой DLL!', mtInformation, [mbOk], 0);
    exit;
  end;
  StrPCopy(aName, EditDLLName.Text);
  FoundDLL := false;
  repeat
    hDLL := GetModuleHandle(aName);
    if hDLL = 0 then
      break;
    FoundDLL := true;
    FreeLibrary(hDLL);
  until false;
  if FoundDLL then
    MessageDlg('Успешно!', mtInformation, [mbOk], 0)
  else
    MessageDlg('DLL не найдена!', mtInformation, [mbOk], 0);
  EditDLLName.Text := '';
end;

Метод вызывается при клике кнопки "OK". Он проверяет, является ли поле текста EditDLLName пустым, и если это так, то предлагает пользователю ввести имя DLL. Затем он пытается найти указанную DLL с помощью функции GetModuleHandle и выгрузить ее из памяти, вызвав FreeLibrary. Если DLL была найдена и успешно выгружена, будет отображаться диалоговое окно сообщения "Успешно!". В противном случае будет отображаться диалоговое окно сообщения "DLL не найдена!".

Вот альтернативное решение:

Вместо использования повторяющегося цикла для многократного вызова функций GetModuleHandle и FreeLibrary, вы можете использовать блок try-finally, чтобы обеспечить выгрузку DLL даже в случае ошибки. Вот как можно модифицировать ваш метод:

procedure TForm1.OkBtnClick(Sender: TObject);
var
  hDLL: THandle;
  aName: array[0..10] of char;
begin
  if EditDLLName.Text = '' then
  begin
    MessageDlg('Сначала вы должны ввести имя выгружаемой DLL!', mtInformation, [mbOk], 0);
    exit;
  end;
  StrPCopy(aName, EditDLLName.Text);
  try
    hDLL := GetModuleHandle(aName);
    if hDLL <> 0 then
    begin
      FreeLibrary(hDLL);
    end;
  except
     // Обрабатывайте ошибку здесь, например, отображая диалоговое окно сообщения
    MessageDlg('Ошибка выгрузки DLL:', mtError, [mbOk], 0);
  end;
  if EditDLLName.Text = '' then
    EditDLLName.Text := '';
end;

В этом модифицированном методе мы используем блок try-finally, чтобы обеспечить выгрузку DLL даже в случае ошибки. Если вызов GetModuleHandle fails или возвращает недействительный handle, вызов FreeLibrary будет выполнен в finally-블оке, который попытается выгрузить DLL из памяти.

Надеюсь, это поможет! Пожалуйста, если у вас есть вопросы.

Утилита DLL - убийственная утилита для удаления DLL из памяти при помощи формы с полем редактирования и кнопкой 'Ok', используя функцию GetModuleHandle и FreeLibrary.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 01:01:01/0.0035581588745117/0