Как вызвать в C # функцию из Win32 DLL с пользовательскими объектами - PullRequest
1 голос
/ 28 мая 2010

Как использовать в C # функцию из файла Win32 DLL, сделанного в Delphi. Когда параметры функции являются пользовательскими объектами delphi?

Определение функции в Delphi:

function GetAttrbControls(    Code     : PChar;
                              InputList: TItemList;
                              var Values   : TValArray): Boolean; stdcall; export;

Типы, которые используют:

type
  TItem = packed record
    Code : PChar;
    ItemValue: Variant;
  end;

TItemList = array of TItem;

TValArray = array of PChar;

Пример в C # (не работает):

[StructLayout(LayoutKind.Sequential)]
 public class Input
 {
     public string Code;
     public object ItemValue;
 };


[DllImport("Filename.dll", EntryPoint = "GetValues", CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
    public static extern bool GetValues(string Code, Input[] InputList, ref StringBuilder[] Values);

1 Ответ

1 голос
/ 28 мая 2010

Это не может быть сделано по-вашему, но у вас все еще есть некоторые возможности.

Динамические array (объявлено без []), string (AnsiString) и Variant являются указателями на «магические» структуры (они имеют счетчик ссылок и другие данные о отрицательных смещениях), которые обрабатываются встроенный компилятор.

Если вы действительно хотите использовать эти типы, вам нужно сериализовать и материализовать их по интерфейсу (используя некоторый двоичный формат дампа, JSON и т. Д.).

Вы можете попробовать использовать любой из базовых типов (например, array[], ShortString, record), который будет работать именно так, как вы ожидаете (остерегайтесь индексации на основе ShortString 1 с длиной, хранящейся в 0) используя StructLayout, если вы не смешиваете их с управляемыми типами.

Также у меня есть хороший опыт использования интерфейсов (IInterface / IDispatch через COM InterOp) для прямой передачи ссылок на объекты между Delphi и C # кодом. Конечно, вы ограничены в вызове методов интерфейсов, но уровень взаимодействия может обрабатывать как минимум WideString (приятно) и некоторые виды Variant (некрасиво) для вы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...