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

