2015-09-01 5 views
1

Я использую код Unmanaged Exports от Robert Giesecke, чтобы поместить некоторые методы из класса C# в DLL. На данный момент, код:Доступ к неуправляемому экспорту C# из приложения Delphi

[DllExport("add", CallingConvention = CallingConvention.StdCall)] 
public static int TestExport(int left, int right) 
{ 
    return left + right; 
} 

который является таким же, как пример кода Giesecke, в стороне от CallingConvention, но я также пробовал с Cdecl).

Я пытаюсь получить доступ к этому методу в приложении Delphi VCL WinForms. Я следую this article, который говорит об экспорте из DLL Delphi и использует эту функцию в консольном приложении Delphi. Возможно, я ошибочно полагаю, что здесь слишком много общего.

Во всяком случае, есть два замечания:

1) Использование GExperts's PE Информация на этой DLL (экспортируемого из проекта C#) не перечисляет никакого экспорта. Увидев, что этот инструмент показывает точки входа для доступного экспорта, для меня это красный флаг # 1. Я не проверял Dependency Walker.

2) В статье в Delphi говорится о добавлении объявления функции, а затем показан пример. Моя IDE не любит этот синтаксис. Это может быть разница между приложениями и консолями.

const 
    TestExportsDLL = 'CS_CallbackTest_Class.dll'; 
type 
    TForm1 = class(TForm) 
... 

    private 
    function AddIntegers(_a, _b: integer): integer; stdcall; external TestExportsDLL;  
    public 
    { Public declarations } 
    end; 

Я пробовал с несколькими различными вариантами этого. Предполагая, что использование RGiesecke.DllExport - лучший способ сделать это, почему я не могу получить приложение Delphi для компиляции?

+1

Вы объявили метод, но вам нужна отдельная функция. Переместите его за пределы класса. За исключением того, что вам нужно будет добавить 'name 'add'' в конец объявления. – TLama

+0

Прочтите статью еще раз. Ни в коем случае это не означает, что вы можете экспортировать метод формы. Фактически, сам пример, который вы использовали, не имеет 'TForm1' перед его реализацией в любом из четырех примеров его кода. –

+0

@Tlama ok, это вне класса' TForm1'. Составляет. Когда я пытаюсь запустить, я получаю «Приложение не смогло начать правильно (0xc000007b). Нажмите« ОК », чтобы закрыть приложение». Где «добавить»? @KenWhite Это было связано с тем, что статья ссылалась на консольное приложение. Поэтому, по предложению Тламы, я переместил его из реализации 'TForm1'. – ikathegreat

ответ

1

Трудно понять, почему функция не экспортируется. Вы не описали шаги, предпринятые вами для создания DLL. Однако UnmanagedExports работает. Следите за документально оформленными действиями очень осторожно. Один из возможных ключей можно найти в документации, к которой вы привязались:

Задача будет выполняться только в том случае, если вы выбрали конкретную цель ЦП (x86, x64, Itanium) в своей опции сборки.

Пока вы не получите DLL, которая экспортирует вашу функцию, в коде Pascal не так много точек.

Ваш импортный код в замешательстве. Внешняя функция должна быть объявлена ​​в единице объема. Полная программа для импорта выглядит так:

{$apptype console} 

const 
    dllname = '...'; // replace this with the actual name 

function add(left, right: Integer): Integer; stdcall; external dllname; 

begin 
    Writeln(add(42, 624)); 
    Readln; 
end. 

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

  • Нет связанных вопросов^_^