You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#与Delphi字符串互操作疑问:返回类型为何用PWideString?

Delphi x64调用DNNE构建的.NET DLL的字符串传递问题解析

返回类型必须改为PWideString的原因

  • Delphi的WideString本质是对COM标准BSTR的封装,当声明函数返回WideString时,Delphi编译器会自动插入内存管理逻辑:调用完函数后自动调用SysFreeString释放返回的BSTR。但DNNE生成的.NET DLL中,返回的BSTR由.NET运行时分配,Delphi的自动释放会触发跨运行时内存错误,更关键的是这种自动封送逻辑会打乱x64调用约定下的栈帧布局,导致前面的整数、字符串参数传递错位,无法被C#正确接收。
  • 改用PWideString作为返回类型时,Delphi会直接接收原始BSTR指针,不会触发自动内存释放和封送逻辑,栈帧布局完全符合x64调用约定,参数传递自然恢复正常。后续若需释放该BSTR,需按DNNE规范手动处理内存。

字符串参数无需全部用PWideString的原因

  • 输入型字符串参数的传递方向是Delphi → .NET,Delphi的WideString在x64调用约定下会直接传递内部的BSTR指针,DNNE的封送层能正确识别这个指针并转换为.NET的string类型。整个过程不需要额外指针声明,因为Delphi负责输入参数的内存管理,.NET侧仅做读取操作,不会修改或释放该内存,不存在跨运行时内存冲突。
  • 只有当字符串参数是输出型(需要.NET侧分配内存返回给Delphi)时,才需要用PWideString传递指针,让.NET侧直接写入BSTR地址;而输入型参数用WideString就足够,Delphi的默认封送逻辑和DNNE的输入处理完全兼容,不会引发栈帧问题。

内容的提问来源于stack exchange,提问作者White

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:02:38