【问题标题】:Updating Inno Setup progress bar from Dephi DLL从 Dephi DLL 更新 Inno Setup 进度条
【发布时间】:2016-02-08 03:04:41
【问题描述】:

我需要你的帮助。我正在尝试从 Inno Setup (ANSI) 中用 Delphi 10 Seattle 编写的 DLL 调用函数。但我不明白是什么问题。如果我在 Delphi 中创建应用程序并从 DLL 调用此函数,它就可以完美运行!见代码清单:

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 设置 (ANSI):

function Count(Progr: TNewProgressBar): integer; external 'Process@files:CallC.dll stdcall delayload';

procedure NewButton1Click(Sender: TObject);
begin
   Count(NewProgressBar1);
end;

通话后我得到访问冲突。但是,我阅读的 dpr 文件中的注释,ShareMem 写入第一行,但效果为零。

请告诉我如何从 Delphi DLL 正确更新 Inno Setup 中的进度条。

【问题讨论】:

  • 我认为你不能期望在安装程序和 dll 之间传递一个像进度条这样的对象。您需要在安装程序中访问 prog 栏。
  • 另外,你说你可以从 Delphi 主机调用 DLL。但即使这样也是错误的。如果它有效,那是靠运气而不是设计。
  • Ammm...我是怎么做到的?
  • 您需要回调安装程序以推进 PB。
  • 当然可以,但是怎么做呢?也许你给我看简单的示例代码?

标签: delphi dll progress-bar inno-setup pascalscript


【解决方案1】:

您不能以这种方式调用对象方法。如果您使用的 Delphi 版本与构建 Inno Setup 的版本完全相同,那么您可能会很幸运,正如您对 Delphi 应用程序的测试所示。但这仍然是错误和不可靠的,不要这样做。当你使用不同的 Delphi 版本时,进度条类在内存中的布局是不同的,因此 “访问冲突”。


对于这个特定的任务,您只需一个进度条的句柄就可以轻松完成:

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;

对于更高级的任务,您需要使用回调。

见

【讨论】:

  • 即使内存布局相同,但还是错了,前面已经讨论过很多次了。请不要延续任何关于跨 dll 边界共享类是有效的神话。
  • @DavidHeffernan 我刚刚试图解释 OP 为什么他很幸运能够使用 Dephi 应用程序进行测试。我的目的不是建议应该使用它。我已经更新了我的措辞。
  • 伙计们伙计们!!!这种方法是完美的,但不工作,我不明白为什么?!我编译并单击按钮。窗体冻结 2 秒,进度条位置不变。见ScreenShot
  • @Martin Prikryl - 请问一下,ProgressBar 没有变化。
  • 可能没有任何东西在抽取消息队列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 2019-11-05
  • 1970-01-01
相关资源
最近更新 更多