|
Вызов функций из неуправляемой библиотеки (unmanaged dll) на примере Delphi
В данной статье будет рассмотрен пример как вызывать процедуры и функции из бинарного dll, то есть не IL код, а библиотеки написанной не на .Net (например Delphi)
Причины данного действия могут быть самые разные, например: использование готового куска кода написанного на другом языке (не .NET); специальное написание куска кода на unmanaged code с целью защиты от дизассемблеров и декомпиляторов
Итак, имеем динамическую библиотеку dllform.dll написанную на Delphi в которой объявлены функция
function CreateForm(Caption: PWideChar): LongWord; stdcall; external 'DllForm.dll' name 'CreateForm';
|
и процедура
procedure FreeForm(Handle: LongWord); stdcall; external 'DllForm.dll' name 'FreeForm';
|
Функция создает обычную форму и возвращает указатель на нее, в качестве параметра передается строка – title окна, а процедура закрывает эту форму передавая в качестве параметра указатель на форму
Теперь самое время поговорить о соответствии типов данных C# и Delphi
| Delphi | C# |
| Integer | int |
| Cardinal | uint |
| Shortint | sbyte |
| Smallint | short |
| Longint | int |
| Int64 | long |
| Byte | byte |
| Word | ushort |
| Longword | uint |
| - | char |
| - | ulong |
| Double | double |
| Single | float |
| Real48 | - |
| Extended | - |
| Comp | - |
| Currency | - |
| - | decimal |
| Boolean | bool |
| string | string |
| TDateTime | DateTime (класс) |
Так как в C# не может быть методов вне классов, то создаем класс обертку, статические методы которого и будут вызывать функции dll.
public class LibWrap
{
[DllImport(@"dllform.dll")]
public static extern uint CreateForm([MarshalAs(UnmanagedType.LPWStr)] string Caption);
[DllImport(@"dllform.dll")]
public static extern void FreeForm(uint Handle);
}
|
Замечание:
Для передачи строковых параметров необходимо явно указывать маршализацию параметра, для типа DateTime необходимо преобразовать объект в формат понятный Delphi с помощью метода ToOADate()
После того как класс-обертка создан, создаем тестовое окно с двумя кнопками: первая вызывает функцию CreateForm создавая тем самым новую форму, вторая кнопка будет закрывать созданное окно
public partial class Form1 : Form
{
uint qwe;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string widechar = "Привет";
qwe = LibWrap.CreateForm(widechar);
}
private void button2_Click(object sender, EventArgs e)
{
LibWrap.FreeForm(qwe);
}
}
|
Оглавление   
Средняя оценка:     (5 - 3 голосов) Для оценки необходимо зарегистрироваться
Только зарегистрировавшиеся пользователи могут оставлять комментарии
Комментирует johnhimik17 27.02.2010 18:55:28
Комментирует d1m491 09.06.2011 11:43:49
Комментирует LazyBoy 05.10.2011 19:42:11 Полезная инфа, спасибо :)
|
|