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

C#与Delphi类型转换问题:调用writeSimulator方法报错

解决Delphi调用C#类库byte[]参数的类型转换异常问题

C#类库中的writeSimulator(byte[] data, byte nombre)方法,在Delphi导入后生成的代理类要求data参数为PSafeArray类型。直接将Delphi字节数组强制转换为PSafeArray会触发类型转换异常——因为Delphi的动态/静态字节数组与OLE的PSafeArray内存结构完全不同,必须通过专门的API完成转换。

正确实现步骤

  • 使用SafeArrayCreateVector创建一个元素类型为Byte的SafeArray,长度与Delphi字节数组一致。
  • 通过SafeArrayAccessData锁定SafeArray并获取数据指针,将Delphi字节数组的内容复制到SafeArray中。
  • 调用writeSimulator方法后,务必释放SafeArray避免内存泄漏。

代码示例(以TBytes类型的SendBuff为例)

var
  SafeArr: PSafeArray;
  DataPtr: PByte;
begin
  // 创建对应长度的Byte类型SafeArray
  SafeArr := SafeArrayCreateVector(varByte, 0, Length(SendBuff) - 1);
  try
    if SafeArrayAccessData(SafeArr, Pointer(DataPtr)) = S_OK then
    try
      // 复制Delphi字节数组数据到SafeArray
      Move(SendBuff[0], DataPtr^, Length(SendBuff));
    finally
      // 解锁SafeArray
      SafeArrayUnaccessData(SafeArr);
    end;
    // 调用目标方法
    MCMT2021.VoieAD.writeSimulator(SafeArr, NumbyteWrite);
  finally
    // 释放SafeArray
    SafeArrayDestroy(SafeArr);
  end;
end;

静态数组的适配

如果SendBuff是静态数组(如array[0..15] of Byte),只需将Length(SendBuff)替换为SizeOf(SendBuff)即可:

SafeArr := SafeArrayCreateVector(varByte, 0, SizeOf(SendBuff) - 1);
// ...
Move(SendBuff[0], DataPtr^, SizeOf(SendBuff));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:02:09