从 C# 中的 Delphi 指针读取字节数组
Reading Byte Array From Delphi Pointer In C#
我以前问过问题。
我添加了两个这样的方法。
C#
public interface IStringFunctions
{
[MethodImplAttribute(MethodImplOptions.PreserveSig)]
void SetValueAsByteArray(IntPtr DataPointer, int DataLength);
[MethodImplAttribute(MethodImplOptions.PreserveSig)]
IntPtr GetValueAsByteArray(out int DataLength);
}
if (instance != null)
{
// Sending Pointer of Byte Array To Delphi Function.
byte[] inputBytes = new byte[3];
inputBytes[0] = 65;
inputBytes[1] = 66;
inputBytes[2] = 67;
IntPtr unmanagedPointer = Marshal.AllocHGlobal(inputBytes.Length);
Marshal.Copy(inputBytes, 0, unmanagedPointer, inputBytes.Length);
instance.SetValueAsByteArray(unmanagedPointer, inputBytes.Length);
// Getting Byte Array from Pointer
int dataLength = 0;
IntPtr outPtr = instance.GetValueAsByteArray(out dataLength);
byte[] outBytes = new byte[dataLength];
Marshal.Copy(outPtr, outBytes, 0, dataLength);
string resultStr = System.Text.Encoding.UTF8.GetString(outBytes);
}
Delphi DLL
TStringFunctions = class(TInterfacedObject, IStringFunctions)
private
FValueAsByteArray: TByteArray;
public
procedure SetValueAsByteArray(DataPointer:Pointer;DataLength:Integer); stdcall;
function GetValueAsByteArray(out DataLength:Integer): Pointer; stdcall;
end;
procedure TStringFunctions.SetValueAsByteArray(DataPointer:Pointer;DataLength:Integer); stdcall; export;
var
Source: Pointer;
SourceSize: Integer;
Destination: TByteArray;
begin
Source := DataPointer;
SourceSize := DataLength;
SetLength(Destination, SourceSize);
Move(Source^, Destination[0], SourceSize);
FValueAsByteArray := Destination;
ShowMessage(TEncoding.UTF8.GetString(TBytes(Destination)));
ShowMessage(IntToStr(Length(Destination)));
ShowMessage('DataLength:'+IntToStr(DataLength));
end;
function TStringFunctions.GetValueAsByteArray(out DataLength:Integer): Pointer; stdcall; export;
begin
DataLength := Length(FValueAsByteArray);
ShowMessage(TEncoding.UTF8.GetString(TBytes(FValueAsByteArray)));
ShowMessage(IntToStr(Length(FValueAsByteArray)));
Result := Addr(FValueAsByteArray);
end;
SetValueAsByteArray 有效。
但是 GetValueAsByteArray 方法的指针和字节不正确。
如何在 c# 中读取 FValueAsByteArray 和 bytes[] 的正确指针?
我有什么错?
Result := Addr(FValueAsByteArray);
这是数组指针的地址。你要return数组的地址:
Result := Pointer(FValueAsByteArray);
如果我是你,我会避免分配非托管内存并让编组器编组字节数组。
我已经告诉过你 export
的无用性。重复我自己是令人沮丧的。
我以前问过问题。
我添加了两个这样的方法。
C#
public interface IStringFunctions
{
[MethodImplAttribute(MethodImplOptions.PreserveSig)]
void SetValueAsByteArray(IntPtr DataPointer, int DataLength);
[MethodImplAttribute(MethodImplOptions.PreserveSig)]
IntPtr GetValueAsByteArray(out int DataLength);
}
if (instance != null)
{
// Sending Pointer of Byte Array To Delphi Function.
byte[] inputBytes = new byte[3];
inputBytes[0] = 65;
inputBytes[1] = 66;
inputBytes[2] = 67;
IntPtr unmanagedPointer = Marshal.AllocHGlobal(inputBytes.Length);
Marshal.Copy(inputBytes, 0, unmanagedPointer, inputBytes.Length);
instance.SetValueAsByteArray(unmanagedPointer, inputBytes.Length);
// Getting Byte Array from Pointer
int dataLength = 0;
IntPtr outPtr = instance.GetValueAsByteArray(out dataLength);
byte[] outBytes = new byte[dataLength];
Marshal.Copy(outPtr, outBytes, 0, dataLength);
string resultStr = System.Text.Encoding.UTF8.GetString(outBytes);
}
Delphi DLL
TStringFunctions = class(TInterfacedObject, IStringFunctions)
private
FValueAsByteArray: TByteArray;
public
procedure SetValueAsByteArray(DataPointer:Pointer;DataLength:Integer); stdcall;
function GetValueAsByteArray(out DataLength:Integer): Pointer; stdcall;
end;
procedure TStringFunctions.SetValueAsByteArray(DataPointer:Pointer;DataLength:Integer); stdcall; export;
var
Source: Pointer;
SourceSize: Integer;
Destination: TByteArray;
begin
Source := DataPointer;
SourceSize := DataLength;
SetLength(Destination, SourceSize);
Move(Source^, Destination[0], SourceSize);
FValueAsByteArray := Destination;
ShowMessage(TEncoding.UTF8.GetString(TBytes(Destination)));
ShowMessage(IntToStr(Length(Destination)));
ShowMessage('DataLength:'+IntToStr(DataLength));
end;
function TStringFunctions.GetValueAsByteArray(out DataLength:Integer): Pointer; stdcall; export;
begin
DataLength := Length(FValueAsByteArray);
ShowMessage(TEncoding.UTF8.GetString(TBytes(FValueAsByteArray)));
ShowMessage(IntToStr(Length(FValueAsByteArray)));
Result := Addr(FValueAsByteArray);
end;
SetValueAsByteArray 有效。
但是 GetValueAsByteArray 方法的指针和字节不正确。
如何在 c# 中读取 FValueAsByteArray 和 bytes[] 的正确指针?
我有什么错?
Result := Addr(FValueAsByteArray);
这是数组指针的地址。你要return数组的地址:
Result := Pointer(FValueAsByteArray);
如果我是你,我会避免分配非托管内存并让编组器编组字节数组。
我已经告诉过你 export
的无用性。重复我自己是令人沮丧的。