如何在Inno Setup Pascal脚本中取消引用指针?

问题描述 投票:0回答:1

我在Inno Setup脚本中从DLL文件中调用了一个函数,其返回类型为PAnsiChar。为了获得整个字符串,我需要取消对指针的引用,但是标准的pascal语法在这里不起作用。甚至有可能做到这一点?

function SQLDLL : PAnsiChar;
external 'GetSQLServerInstances@files:IsStartServer.dll stdcall setuponly';

function NextButtonClick(CurPage: Integer): Boolean;
var
  hWnd: Integer;
  Str : AnsiString;
begin
  if CurPage = wpWelcome then begin
    hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));

    MessageBox(hWnd, 'Hello from Windows API function', 'MessageBoxA', MB_OK or MB_ICONINFORMATION);

    MyDllFuncSetup(hWnd, 'Hello from custom DLL function', 'MyDllFunc', MB_OK or MB_ICONINFORMATION);

    Str := SQLDLL;
    try
      //if this DLL does not exist (it shouldn't), an exception will be raised
      DelayLoadedFunc(hWnd, 'Hello from delay loaded function', 'DllFunc', MB_OK or MB_ICONINFORMATION);
    except
      //handle missing dll here
    end;
  end;
  Result := True;
end;

我只有DLL文件。原始语言是Delphi。

pointers inno-setup dereference
1个回答
0
投票

您不能在Inno Setup Pascal脚本中取消引用指针。

但是,有许多黑客手段可以做到这一点。这些黑客非常具体,因此取决于特定的用例。


尽管在您的特定情况下,由于指向字符数组的指针已在API中广泛使用,Inno Setup Pascal脚本会自动将其编组为字符串。

因此,您应该可以简单地将PChar分配给AnsiString

function ReturnsPAnsiChar: PAnsiChar; extern '...';

var
  Str: AnsiString;
begin
  Str := ReturnsPAnsiChar;
end;

请参见How to return a string from a DLL to Inno Setup?

© www.soinside.com 2019 - 2024. All rights reserved.