2015-05-12 99 views
0

我問過以前的問題。 Call Delphi Function From C#從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);    
} 

德爾福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方法不正確的指針和字節。

如何閱讀FValueAsByteArray的正確的指針,並在C#中的字節[]?

我的錯?

回答

3
Result := Addr(FValueAsByteArray); 

這就是指向數組的指針的地址。要返回數組的地址:

Result := Pointer(FValueAsByteArray); 

如果我是你,我會避免分配非託管內存,讓編組元帥字節數組。

我已經告訴過你export的徒勞。重複一下自己真令人沮喪。