2017-09-22 4 views
0

Ich habe den folgenden Export von einer DLL mit Delphi2006 gemacht.Wie marshall Array von Int von C# zu Delphi

procedure ScSetMRStatus(StatusType: TStatusType; active_mr_ids: TLongIntArray; id_dst: Integer; id_src_list: TLongIntArray; IsComplete: Boolean); stdcall; export; 

wo TLongIntArray wie folgt definiert ist:

TLongIntArray = array of LongInt; 

und TStatusType ist nur ein Enum:

TStatusType = (stPhysical, stMaster); 

nun diese Methode aus einer C# -Anwendung zu nennen ich versuchte.

[DllImport(DelphiDLLName, EntryPoint = "ScSetMRStatus", CallingConvention = CallingConvention.StdCall)] 
private static extern void ScSetMRStatus(
    Int32 statusType, 
    IntPtr activeMrIds, 
    Int32 IdDst, 
    IntPtr idSrcList, 
    [MarshalAs(UnmanagedType.U1)] bool isComplete); 

es auf diese Weise von C#:

ScSetMRStatus((Int32) statusType, ConvertManagedArrayToDelphiDynIntArray(activeMrIds), idDst, ConvertManagedArrayToDelphiDynIntArray(idSrcList), isComplete); 

ConvertManagedArrayToDelpiDynIntArray wie folgt aussieht:

public static IntPtr ConvertManagedArrayToDelphiDynIntArray(int[] array) 
{ 
    if (array == null) return IntPtr.Zero; 

    int elementSize = sizeof(int); 
    int arrayLength = array.Length; 
    int allocatedMemSize = 8 + elementSize * arrayLength; 
    IntPtr delphiArrayPtr = Marshal.AllocHGlobal(allocatedMemSize); 
    Marshal.WriteInt32(delphiArrayPtr, 0, 1); 
    Marshal.WriteInt32(delphiArrayPtr, 4, arrayLength); 
    for (int k = 0; k < arrayLength; k++) { 
     Marshal.WriteInt32(delphiArrayPtr, 8 + k*elementSize, array[k]); 
    } 
    return delphiArrayPtr+8; 
} 

Aber das funktioniert nicht!

Wie sende ich C# -Arrays zu Delphi?

Antwort

1

Es funktioniert endlich!

Wir haben ein paar Änderungen um den Anruf gemacht, um den zugewiesenen Speicher freizugeben.

Wir dachten einfach, es würde nicht funktionieren, da wir uns nicht angesehen haben, was die Delphi Seite damit macht. Alle Daten kommen in die Delphi-DLL und es funktioniert gut.

Vielleicht gibt es ein Speicherproblem, aber wir werden dies untersuchen.