从 Delphi 调用 dotNET 并返回一个字符串

2023-11-25

Delphi 应用程序如何调用导出函数(非 COM)dotNET 程序集并让该函数返回字符串?

对于我的特定应用程序来说,COM 不是一个可能的解决方案。我可以控制通话的两端。

到目前为止我所尝试过的 - Delphi 客户端

type
  TStrProc = procedure( var x: widestring); stdcall;

function TryIt: string;
var
  Handle: THandle;
  Proc: TStrProc;
  InData: widestring;
  OutData: widestring;
begin
  Handle    := LoadLibrary( 'DelphiToDotNet.dll');
  if Handle = 0 then exit;
  @Proc := GetProcAddress( Handle, 'StrProc');
  if @Proc <> nil then
    begin
    InData := 'input';
    Proc( InData);
    OutData := InData;
    end;
  FreeLibrary( Handle);
  result := OutData
end;

dotNET dll端

public class DotNetDllClass
{
  [DllExport]
  public static string StrProc(ref string s)
  {
      return "Hello from .Net " + s;
  }
}

什么有效

我可以成功地将整数传入和传出 dotNET 过程。 我可以成功地将字符串(Delphi 端的宽字符串)传递到 dotNET 过程中。

什么不起作用

在上面的两个清单中,返回的字符串参数是垃圾。访问它会导致 AV。

环境

Delphi XE7、dotNET 4、Win 7、32 位应用程序和 dll。


与Delphi相匹配的C#代码应该是:

[DllExport]
public static void StrProc(
    [MarshalAs(UnmanagedType.BStr)] 
    ref string s
)
{
    s = "Hello from .Net " + s;
}

请注意,返回类型是void以匹配您的 Delphi 代码。而且我用过UnmanagedType.BStr匹配WideString。这是编组文本的最简单方法,因为分配是由两个编译器自动执行的。

不要因为尝试将字符串作为封送的返回值传递而陷入困境BStr。 Delphi 不使用与其他编译器相同的 ABI,请参阅为什么 WideString 不能用作互操作的函数返回值?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Delphi 调用 dotNET 并返回一个字符串 的相关文章

随机推荐

  • 如何使用 XPath 获取属性的值

    我一直在使用 Selenium WebDriver 进行测试 并且一直在寻找 XPath 代码来获取 HTML 元素的属性值 作为回归测试的一部分 但我找不到一个好的答案 这是我的示例 html 元素 div class firstdiv
  • 如何实现android视频播放器全屏播放

    我已经实现了android视频播放器 但我不需要像这样我需要什么意思当我打开活动时我需要支付视频半屏在中心当我点击按钮全屏按钮然后我需要全屏支付 如何实现它帮助我 视频播放器活动 public class VideoPlayerActivi
  • 如何在intellij idea编辑器中删除顶行面包屑?

    我在弄清楚 IntelliJ Idea Community Edition 15 中的此显示栏时遇到问题 有谁知道这是什么和 或如何将其关闭 它被称为当前代码位置的面包屑菜单 例如 在您的图像中 您处于类 Display gt 方法 Dis
  • 通过 JDBC 集成 Spark SQL 和 Apache Drill

    我想根据使用 Apache Drill 对 CSV 数据 在 HDFS 上 执行查询的结果创建 Spark SQL DataFrame 我成功配置了 Spark SQL 使其通过 JDBC 连接到 Drill Map
  • 如何将 JSON 格式的数据从 WebView 传递到 HTML 页面

    我正在尝试将 JSON 格式的数据从 Android WebView 传递到 HTML 页面 但是 每当我尝试解析原始 JSON 数据时 应用程序就会崩溃 我希望其格式为 key data 我的应用程序的目标是解释此 JSON 数据 将其形
  • 如何检测 Angular2 中的变量变化

    我有以下配置对象 它是在构造函数运行之前设置的 config Object onSlideChangeEnd function slide any this currentSlideIndex slide activeIndex 我想通知服
  • 如何使用 C# 获取 IIS 中网站的“浏览”URL?

    假设我在 IIS 中有 站点名称 网站 我可以通过以下方式访问它的大部分功能服务器管理器我的 C 代码中的类 我似乎不知道如何获取它的 浏览 URL 就像我在下面的屏幕截图中所示的那样 如果我进入 管理网站 gt 浏览 IIS管理器 它将使
  • 在 ASP.NET MVC 中将数据传递到母版页

    在不违反 MVC 规则的情况下将数据传递到母版页 使用 ASP NET MVC 的方法是什么 就我个人而言 我更喜欢编写传递给所有视图的抽象控制器 基本控制器 或基类 如果您希望视图具有强类型视图数据类 这可能适合您 其他解决方案可能更多c
  • Google AdMob“我们将尝试不再展示该广告”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我正在使用 AdMob 在 Android 应用中展示广告 我已经整合了所有步骤 并且收到了广告 但突然它开始显示 我们会尽量不再展示该广告 为什么会出现这种情况 None
  • 范围运算符从最大到最小递减:10..1 [重复]

    这个问题在这里已经有答案了 Perl 有一个范围运算符 当在foreach循环 不创建临时数组 foreach 1 1 000 000 code 如果第一个整数小于第二个整数 则不运行迭代 foreach 1 000 000 1 code
  • 将 DataTable 分配给 ViewState 是持久数据的好方法吗?

    我从数据库获取一个 DataTable 并分配给 ViewState 如下所示 因为我不想每次都访问我的数据库 只想检查 DataTable 以进行后续查找 DataTable dt GetDataTable ViewState dtTab
  • 如何确定计算机是否运行 XP Service pack 3

    使用注册表或文件系统 限制的原因是我将其作为 MSI 条件语句来执行 Cheers 在注册表项下 HKLM SOFTWARE Microsoft Windows NT CurrentVersion 寻找密钥对 当前版本 Microsoft
  • 在 Emacs 中使用 Python 的 Unicode 转换问题

    我试图了解在命令行上运行与作为 Emacs elisp 函数的一部分运行时 Python 脚本行为的差异 该脚本如下所示 顺便说一句 我使用的是 Python 2 7 1 import json t Foo print json dumps
  • 您将如何在 SQL 数据库中创建和存储用户定义的自定义字段?

    我需要允许用户向记录添加新字段 例如如果有联系人记录 用户可能想要添加 SSN 数字字段和 生日 日期 日历字段 当然 他们会通过用户界面来完成此操作 这些字段应该可用于输入所有联系人记录 考虑到我的应用程序同时为许多用户运行 不是单一公司
  • Angular Universal 生成 404(和其他 HTTP 代码)标头

    我正在使用 Angular Universal 创建一个网站 它将进行服务器端渲染 以便搜索引擎可以对其进行索引 我已经编码了 404 后备路由 它正确显示了其组件 但它显示了 HTTP 200 标头代码 如何强制使用特定的标头代码 我用谷
  • iOS 应用程序在 iOS 14 及更低版本的 Testflight 上启动时崩溃,但在 iOS 15+ 上不会崩溃

    从几天前开始 我们的应用程序和 或 Testflight 遇到了一些奇怪的问题 当从 Xcode 运行时 我们的应用程序在模拟器和设备 iOS 12 iOS 14 和 iOS 15 上运行良好 但当我们运行时 它在启动时崩溃了 通过 Tes
  • 如何让 IntelliJ 对项目中的所有主文件使用 JVM 选项?

    我可以配置一个主文件以使用所需的本机 但在我的项目中有多个主要函数 因此当我可以选择调试我想要的任何一个而无需为每个函数创建配置时 我需要所有文件来使用 JVM 选项一 您可以更改下面的配置Defaults node 模板在新版本中 所有新
  • 在 Xcode 10 中构建时重置应用程序后 String.hashValue 不唯一

    我有一个 通过以下方式获取字符串的哈希值 String hashValue 代码 我在下面添加了它 该代码在 Xcode 9 4 1 中运行良好 工作良好意味着每当我关闭应用程序并重新打开它时 结果hashValue相同 唯一 privat
  • C++ 函数中静态变量的生命周期是多长?

    如果一个变量被声明为static在函数的作用域中 它仅初始化一次并在函数调用之间保留其值 它的寿命究竟是多少 它的构造函数和析构函数什么时候被调用 void foo static string plonk When will I die T
  • 从 Delphi 调用 dotNET 并返回一个字符串

    Delphi 应用程序如何调用导出函数 非 COM dotNET 程序集并让该函数返回字符串 对于我的特定应用程序来说 COM 不是一个可能的解决方案 我可以控制通话的两端 到目前为止我所尝试过的 Delphi 客户端 type TStrP