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

Решение проблемы доступа при обновлении индикатора прогресса в Inno Setup с помощью Delphi-библиотеки

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

Проблема, с которой столкнулся пользователь, заключается в том, что при попытке обновить индикатор прогресса в Inno Setup с помощью функции из динамически подключаемой библиотеки (DLL), написанной на Delphi, происходит ошибка доступа. Это происходит из-за того, что передача объектов между Inno Setup и DLL не является корректной.

Подробности проблемы

В коде Delphi DLL присутствует функция Process, которая принимает в качестве параметра объект TProgressBar и обновляет его положение в цикле. В Inno Setup используется функция Count, которая вызывает эту же функцию из DLL. Однако при вызове функции Count в Inno Setup возникает ошибка доступа.

Пример кода из Delphi DLL

function Process(Pb: TProgressBar): Integer; stdcall;
var
  I: Integer;
begin
  for I := 0 to 1000 do
  begin
    Pb.Position := I;
    Pb.Update;
    Sleep(10);
  end;
end;
Exports
  Process;

Пример кода из Inno Setup

function Count(Progr: TNewProgressBar): integer;
  external 'Process@files:CallC.dll stdcall delayload';
...
procedure NewButton1Click(Sender: TObject);
begin
  Count(NewProgressBar1);
end;

Подтвержденное решение

Передача объектов между Inno Setup и DLL не представляется возможной, и даже если это работает на одной конфигурации, на другой может произойти ошибка из-за различий в памяти. Вместо этого следует использовать дескриптор окна (handle) для обновления состояния прогресс-бара.

function Process(Handle: THandle): Integer;
var
  I: Integer;
begin
  SendMessage(Handle, PBM_SETRANGE, 0, 1000 shl 16);
  for I := 0 to 1000 do
  begin
    SendMessage(Handle, PBM_SETPOS, I, 0);
    UpdateWindow(Handle);
    Sleep(10);
  end;
end;

И в Inno Setup вызывать функцию с передачей дескриптора окна прогресс-бара:

function Count(Handle: THandle): integer;
  external 'Process@files:CallC.dll stdcall delayload';
...
procedure NewButton1Click(Sender: TObject);
begin
  Count(NewProgressBar1.Handle);
end;

Альтернативные методы для более сложных задач

Для более сложных задач, требующих обратного вызова (callback), можно обратиться к следующим ресурсам:

Заключение

В данной статье была описана проблема, связанная с передачей объектов между Inno Setup и Delphi DLL, и предложено решение, которое заключается в использовании дескрипторов окон вместо передачи объектов. Это позволяет корректно обновлять состояние прогресс-бара без доступа к его методам из DLL.

Создано по материалам из источника по ссылке.

Проблема заключается в некорректной передаче объектов между Inno Setup и Delphi-библиотекой при обновлении индикатора прогресса, что приводит к ошибкам доступа, и решение состоит в использовании дескрипторов окон для корректного обновления прогресс-бара.


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

Получайте свежие новости и обновления по 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-02-05 10:49:56/0.0033509731292725/0