gpt4 book ai didi

c# - 如何使用 Interop 正确地将 Delphi 记录传递到 C# 结构?

转载 作者:行者123 更新时间:2023-12-02 02:11:57 24 4
gpt4 key购买 nike

在 Delphi 中,我有这样的结构:

  TCustomerInfo = Packed Record
CustomerNo: Integer;
FirstName: String[50];
LastName: String[50];
End;

使用这样的虚拟过程:

procedure GetCustomer(CustomerNo: Integer; var CustomerInfo: TCustomerInfo);
begin
CustomerInfo.CustomerNo := 19901;
CustomerInfo.FirstName := 'JOHN';
CustomerInfo.LastName := 'DOE';
end;

在 C# 中我有这个:

 [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=1)]
struct CUSTOMER_INFO
{
public Int32 CustomerNo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=50)]
public string FirstName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=50)]
public string LastName;
}

使用像这样导入的 Delphi 函数:

 [DllImport("Exceline.dll")]
extern static void GetCustomer(Int32 CustomerNo, ref CUSTOMER_INFO CustomerInfo);

这个想法是确保所有内存分配和存储都由 C# 应用程序处理。

我的问题是,从 GetCustomer 返回后,没有任何内容分配给我的 C# 结构:-/

最佳答案

我最终想出了一个避免所有 Alloc/FreeHGlobal 的解决方案,但如果这对于垃圾收集器来说确实是无懈可击的,那就是另一回事了。

解决方案是首先使用 FillChar 清除 TCustomer 结构,然后使用 Move 过程复制数据。

delphi 记录如下所示:

  TCustomer = packed record
CustomerNo: Integer;
FirstName: array [1..50] of Char;
LastName: array [1..50] of Char;
end;

然后我用一个过程将字符串复制到结构中:

procedure StrToBuf(Str: String; var buf);
begin
Move(Pointer(str)^, buf, Length(str));
end;

在一个过程中或多或少像这样:

procedure LoadCustomerFromQuery(var Query: TQuery; var Customer: TCustomer); stdcall;
begin

FillChar(Customer, SizeOf(Customer), 0);

StrToBuf(Query.FieldByName('FNAVN').AsString, Customer.FirstName);
StrToBuf(Query.FieldByName('ENAVN').AsString, Customer.LastName);

Customer.CustomerNo := Query.FieldByName('KUNDENR').AsInteger;

end;

最后,C# 结构如下所示:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=1)]
public struct TCustomer
{
public Int32 CustomerNo;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
public string FirstName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
public string LastName;
}

关于c# - 如何使用 Interop 正确地将 Delphi 记录传递到 C# 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3231258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com