Задача: написать
dll на C++, чтобы потом её можно было подключить и использовать в visual basic
6 и других средах программирования
Среду для разработки dll использовал Visual Studio C++ 6.0
Для того чтобы создать динамическую библиотеку в данной
среде, необходимо создать проект "Win32 Dynamic-Link Library".
Тонкости написания dll: используется специфический синтаксис
для того чтобы скомпилировать именно библиотеку.
Допустим у нас есть
простая функция
int sum(int x, int y)
{
return x+y;
}
Возвращающая сумму двух чисел. Нам необходимо создать
библиотеку с данной функцией и потом в VB6 при помощи API вызовов использовать
данную функцию.
В заголовочном файле
декларируем функцию:
long _stdcall Summ(int x, int y);
Описание макроса
_stdcall:
Это соглашение вызова или модель
вызова. Часть двоичного интерфейса приложений, которая
регламентирует технические особенности вызова подпрограммы, передачи параметров, возврата из подпрограммы и
передачи результата вычислений в точку вызова.
Директива stdcall:
параметры помещаются в стек слева направо. Очистка стека осуществляется
вызываемой процедурой. Этот вызов обеспечивает обработку фиксированного числа
параметров.
Существующие
директивы:
_MAC
_cplusplus
_cdecl
_cdecl
_stdcall
_pascal
Далее в файле
описания функций реализуем описанную выше функцию сложения.
long _stdcall Summ(int x, int y)
{
return x+y;
}
Теперь самое важное!!! Создаём .DEF файл, он является
файлом описания данной библиотеки. Он содержит список функций, экспортируемых
ею.
Содержание DEF файла:
LIBRARY TESTDLL
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD SINGLE
EXPORTS
Summ @1
Теперь компилируем проект и получаем dll файл. Копируем его
в system32.
Теперь реализуем
проект на VB6:
Private Declare Function Summ Lib "dlltest.dll" _
(ByVal x As Integer, ByVal y As Integer) As Long
Private Sub Form_Click()
Dim s As Integer s = PassStrStdCall(1, 1) Print s
End Sub
Получаем результат: 2
Общий вид проекта на
C++:
DLLTEST.H
#ifndef _DLLTEST_H_
#define _DLLTEST_H_
#include <stdio.h>
#include <windows.h>
long _stdcall PassStrStdCall(int x, int y);
#endif
DLLTEST.CPP
#include "dlltest.h"
long _stdcall PassStrStdCall(int x, int y)
{
return x+y;
}
DEF файл
LIBRARY TESTDLL
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD SINGLE
EXPORTS
Summ @1