louis vuitton bag moncler jacka ugg boots mbt sko louis vuitton oslo moncler ugg www.steklo1.ru
   Поиск
 

Статьи

C# & .Net

Cи Шарп это просто Simple C#
Логин Пароль Вход Регистрация
Главная
Изучаем C#
Web-приложения
Win-приложения
Web-сервисы
ADO.NET
FrameWork
Алгоритмы
Исходники
Классы
Среда разработки
Статьи
Форум
FAQ
О Проекте
Обратная связь
Отблагодарить
Rambler's Top100

Вызов функций из неуправляемой библиотеки (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
Полезная инфа, спасибо :)



Практический обучающий видео-курс "Основы C#"

От профессионального
разработчика для начинающих
и опытных программистов!

Кликните, чтобы изучить
язык C# с нуля и научиться
писать программы под платформу .NET!