Подключение Delphi dll к C# проекту

598
15 февраля 2017, 20:53

Есть библиотека CheckUfa.dll В справке разработчика написано, что подключать, нужные мне функции, к Delphi проекту вот так:

function CheckFile(fname,reportName,typRep:PChar;fox:integer):integer; StdCall;
function CheckFile2(fname,typRep:PChar;Precheck:integer):WideString; StdCall;
function CheckFile3(fname,reportName,typRep:PChar;fox:integer):wideString; StdCall;

Менял LPStr, LPWStr. Убирал и ставил разные MarshalAs. IntPtr. Ничего.

Один из примеров того, что пробовал (касаемо CheckFile2):

[DllImport(@"D:\CheckUfa.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPWStr)]
public static extern IntPtr CheckFile2(
            [MarshalAs(UnmanagedType.LPWStr)]
            StringBuilder fname,
            [MarshalAs(UnmanagedType.LPWStr)]
            StringBuilder typRep,
            [MarshalAs(UnmanagedType.I4)]
            int Precheck);
...
StringBuilder sb1 = new StringBuilder(...
StringBuilder sb2 = new StringBuilder(...
return Marshal.PtrToStringUni(CheckFile2(sb1, sb2, 0));
...
Answer 1

Спасибо всем, за помощь.

Подведу итог. Компилятор в Delphi преобразует функцию в процедуру. Именно поэтому в C# нужно использовать void, и out переменную result.

PChar успешно получилось импортировать только в IntPtr, остальные типы были с ошибками.

Нужная мне функция CheckFile2 в тоге заработала вот так:

[DllImport(@"D:\CheckPfr\CheckUfa.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, EntryPoint = "#2")]
        public static extern void CheckFile2(
            [MarshalAs(UnmanagedType.BStr)]
            out string result,
            IntPtr fname,
            IntPtr typRep,
            [MarshalAs(UnmanagedType.I4)]
            int Precheck);

Обратите внимание, что по своей сути fname это строка, поэтому вызывая CheckFile2 я использовал Marshal

CheckFile2(out result, Marshal.StringToBSTR(fname), Marshal.StringToBSTR(typRep), 0);
READ ALSO
Отображение координат chart (полярная)

Отображение координат chart (полярная)

Добрый день, вопрос такойЕсть Chart обычного вида и когда на точку наводится курсор, то отображается плашка с координатами

380
Как в WPF сделать привязку к CheckBox'у?

Как в WPF сделать привязку к CheckBox'у?

Добрый день! Не могу понять как сделать в WPF привязку видимости элемента(Кнопки) к CheckBox'у(видно/не видно), как это можно сделать?

426
Как привязать static ObservableCollection к GridView

Как привязать static ObservableCollection к GridView

Не обновляется UI при изменении коллекции

382
Генерация <option> для datalist ASP.NET

Генерация <option> для datalist ASP.NET

привет! есть код

330