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
BSTRtype, which is used to be a data type for interop function calls. On your C# side you'd marshall your string as theUnmanagedType.BStrtype and on the Inno Setup side you'd use theWideString, which is compatible with theBSTRtype. So your code would then change to this (see also theMarshalling samplechapter of the Unmanaged Exports docs):And on the Inno Setup side with the use of
WideStringto this: