I have a C# DLL which exposes a function using Unmanaged Exports which is called directly by an Inno Setup Pascal script. This function needs to return a string to Inno Setup. My question is how can I accomplish this?
My preferred method is to pass a buffer from Inno Setup to the C# function which will return the string inside this buffer. I've come up with this code:
C# function:
[DllExport("Test", CallingConvention = CallingConvention.StdCall)]
static int Test([Out, MarshalAs(UnmanagedType.LPWStr)] out string strout)
{
strout = "teststr";
return strout.Length;
}
Inno Setup script:
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;
When I run this code the Res
variable is empty (I see "" in the log)
How can I return a string from this DLL?
Note that I am using the Unicode version of Inno Setup. I also don't want to use COM to call this function nor to allocate a buffer in the DLL and return it to Inno Setup.
I would suggest you to use the
BSTR
type, which is used to be a data type for interop function calls. On your C# side you'd marshall your string as theUnmanagedType.BStr
type and on the Inno Setup side you'd use theWideString
, which is compatible with theBSTR
type. So your code would then change to this (see also theMarshalling sample
chapter of the Unmanaged Exports docs):And on the Inno Setup side with the use of
WideString
to this: