Ich versuche, eine DLL in Delphi zu schreiben, um meine C# -App auf eine Advantage-Datenbank zugreifen (mit VS2013 und nicht in der Lage, auf die Daten direkt zugreifen).Retrieve Array von Delphi DLL mit C#
Mein Problem ist, nachdem ich den Aufruf, das Array in C# ist voll von Null-Werten.
Die Delphi-DLL-Code:
TItem = record
Id : Int32;
Description : PWideChar;
end;
function GetNumElements(const ATableName: PWideChar): Integer; stdcall;
var recordCount : Integer;
begin
... // code to get the number of records from ATableName
Result := recordCount;
end;
procedure GetTableData(const ATableName: PWideChar; const AIdField: PWideChar;
const ADataField: PWideChar; result: array of TItem); stdcall;
begin
... // ATableName, AIdField, and ADataField are used to query the specific table, then I loop through the records and add each one to result array
index := -1;
while not Query.Eof do begin
Inc(index);
result[index].Id := Query.FieldByName(AIdField).AsInteger;
result[index].Description := PWideChar(Query.FieldByName(ADataField).AsString);
Query.Next;
end;
... // cleanup stuff (freeing created objects, etc)
end;
Dies scheint zu funktionieren. Ich habe ShowMessage verwendet, um zu zeigen, wie die Informationen aussehen und wie sie aussehen.
Der C# Code:
[StructLayoutAttribute(LayoutKind.Explicit)] // also tried LayoutKind.Sequential without FieldOffset
public struct TItem
{
[FieldOffset(0)]
public Int32 Id;
[MarshalAs(UnmanagedType.LPWStr),FieldOffset(sizeof(Int32))]
public string Description;
}
public static extern void GetTableData(
[MarshalAs(UnmanagedType.LPWStr)] string tableName,
[MarshalAs(UnmanagedType.LPWStr)] string idField,
[MarshalAs(UnmanagedType.LPWStr)] string dataField,
[MarshalAs(UnmanagedType.LPArray)] TItem[] items, int high);
public void GetListItems()
{
int numProjects = GetNumElements("Project");
TItems[] projectItems = new TItem[numProjects];
GetTableData("Project", "ProjectId", "ProjectName", projectItems, numProjects);
}
Dieser Code ausgeführt wird, keine Fehler jeglicher Art, aber wenn ich durch projectItems iterieren jeder kehrt
Id = 0
Description = null
Perfekte Antwort, vielen Dank. Die Verwendung der Zeigerarithmetik war etwas, das ich vorher nicht benutzt hatte (und daher nicht berücksichtigt wurde), aber jetzt scheint es so offensichtlich. – Ranky
Wird der Marshall das nicht-blitbare Array in beide Richtungen marshalieren? –
Ja, sicher. – Ranky