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
相关产品推荐
相关产品推荐

