我在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。
您不能在Inno Setup Pascal脚本中取消引用指针。
但是,有许多黑客手段可以做到这一点。这些黑客非常具体,因此取决于特定的用例。
尽管在您的特定情况下,由于指向字符数组的指针已在API中广泛使用,Inno Setup Pascal脚本会自动将其编组为字符串。
因此,您应该可以简单地将PChar
分配给AnsiString
:
function ReturnsPAnsiChar: PAnsiChar; extern '...';
var
Str: AnsiString;
begin
Str := ReturnsPAnsiChar;
end;