从具有托管输出的C#DLL返回字符串到Inno Setup脚本

奥哈德

我有一个C#DLL,它公开了使用非托管导出的功能,该功能直接由Inno Setup Pascal脚本调用。该函数需要向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 '[email protected]: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。

TLama

我建议您使用该BSTR类型,该类型曾经是互操作函数调用的数据类型。在C#端,将字符串编组为UnmanagedType.BStr类型,在Inno Setup端,将使用WideStringBSTR类型兼容的因此,您的代码将更改为此代码(另请参阅Marshalling sample“非托管导出”文档章节):

[DllExport("Test", CallingConvention = CallingConvention.StdCall)]
static int Test([MarshalAs(UnmanagedType.BStr)] out string strout)
{
    strout = "teststr";
    return 0; // indicates success
}

并在Inno Setup方面使用WideString此功能:

[Code]
function Test(out strout: WideString): Integer;
  external '[email protected]:testdll.dll stdcall';

procedure CallTest;
var
  retval: Integer;
  str: WideString;
begin
  retval := Test(str);
  { test retval for success }
  Log(str);
end;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Inno Setup Pascal脚本中声明变量

Inno Setup Pascal脚本中的多行注释

在Inno Setup脚本中提供SignTool配置

在Inno Setup Pascal脚本中销毁对象

卸载程序中的Inno Setup脚本常量

Inno Setup-如何在Pascal脚本中本地化字符串?

通过回调从Inno Setup调用C#DLL

Inno Setup 以字符串为参数调用 DLL

如何从Inno Setup Pascal脚本设置版本号

在Inno Setup Pascal脚本中访问PAnsiChar指向的内存

Sublime Text中的Inno Setup脚本(.iss)语法高亮显示?

用Maven编译Inno Setup脚本(.iss文件)?

ISS脚本中的消息出现Inno Setup Unicode编码问题

在Inno Setup编译器中运行[Code]或PowerShell脚本

安装结束时用于复制文件的脚本:Inno Setup

在Inno Setup安装程序之后如何运行PowerShell脚本

无法从PowerShell脚本写入默认的Inno Setup日志文件

Inno Setup,根据脚本功能的结果提示执行任务

Inno Setup:仅运行一次卸载脚本

Inno Setup使用Pascal脚本自定义FinishedLabel

如何从批处理或Inno Setup脚本获取Inno Setup版本号?

从Inno Setup拆卸字符串[代码]

Inno Setup 6不能在字符串参数中使用DLL函数,而可以在Inno Setup 5中使用

Inno Setup Unicode版本的Pascal脚本中“字符集”上的“类型不匹配”错误

使用Inno Setup脚本中Inno Setup编译器命令行上指定的路径/值

如何在Inno Setup Pascal脚本中设置现有文件的创建时间

在Inno Setup脚本的[UninstallRun]部分中有关使用RunOnceId的说明

当命令的输出具有特定字符串时执行脚本

Inno Setup-具有依赖项的外部.NET DLL

TOP 榜单

热门标签

归档