2010-05-28 2 views
1

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

Определение функции в 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

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

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

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

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

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

Смежные вопросы