我一直在使用它公开了一个功能的C#DLL 托管输出是直接由Inno Setup的帕斯卡尔脚本调用。 此功能需要返回一个字符串,Inno Setup的。 我的问题是如何才能做到这一点?
我的优选的方法是从创新安装的缓冲器传递给C#函数将返回此缓冲区内的字符串。 我想出了这样的代码:
C#功能:
[DllExport("Test", CallingConvention = CallingConvention.StdCall)]
static int Test([Out, MarshalAs(UnmanagedType.LPWStr)] out string strout)
{
strout = "teststr";
return strout.Length;
}
Inno Setup的脚本:
function Test(var res: String):Integer; external 'Test@files:testdll.dll stdcall';
procedure test1;
var
Res: String;
l: Integer;
begin
SetLength(Res,256);
l := Test(Res);
{ Uncommenting the following line causes an exception }
{ SetLength(Res,l); }
Log('"Res"');
end;
当我运行这段代码的Res
变量是空的(我看“”在日志中)
我怎样才能返回从这个DLL的字符串?
请注意,我用的Inno Setup的Unicode版本。 我也不想使用COM调用此函数,也没有在DLL分配一个缓冲区,并返回到Inno Setup的。