【问题标题】:Passing C-style arrays of structs/records from delphi 5 to C# via COM通过 COM 将 C 样式的结构/记录数组从 delphi 5 传递到 C#
【发布时间】:2012-10-22 12:25:53
【问题描述】:

我在类型库中定义了一个结构,该类型库导入到 Delphi 5 和 C# 程序集中。

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct MyStruct
{
    public uint a;
    public float b;
}

MyStruct = packed record
    a: LongWord;
    b: Single;
end;

在 Delphi 方面,我有一个指向所述结构的 C 样式数组的指针,我想通过 COM 将其传递给 C# 程序集。理想情况下,我希望它在 c# 端作为 myStruct[] 结束,但我会使用一个指向正确编组的内存块的指针,因为这些结构都是 blittable。

我尝试过的两种方法是

void DoFoo([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] MyStruct[] fooArray, int size);
void DoBar(MyStruct[] barArray, int length);

转换为类型库并导入delphi后是

procedure DoFoo(var fooArray: MyStruct; size: Integer); safecall;
procedure DoBar(barArray: PSafeArray; length: Integer); safecall;

我认为安全数组不适用于结构,而另一个显然不是数组。

任何想法/链接/非常感谢。

【问题讨论】:

  • 我想我可以把整个东西当作一个字节[],把它安全地排列到 c# 中,然后给它做一些不安全的指针。

标签: c# delphi com-interop


【解决方案1】:

事实上,我确实将 delphi 中的结构作为安全数组传递给 c#,作为 byte[]。

// C# interop method.
void DoFoo(byte[] myStructs); 

// Delphi SafeArray creation
size := fooNumber* sizeof(Foo);
arrayBounds.lLbound :=  0;
arrayBounds.cElements := size;
safeArray := SafeArrayCreate( varByte, 1, arrayBounds );
SafeArrayLock(safeArray);
Move(pointerToFooArray^, safeArray.pvData^, size);
SafeArrayUnlock(safeArray);
auroraDiagnostics.DoFoo(safeArray);

然后我使用this solution 将其转换回原始结构。

这有点笨拙,但确实有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2011-06-01
    • 2021-07-10
    • 2012-02-20
    相关资源
    最近更新 更多