Дневник

Главная » 2010 » Август » 9 » Написание DLL на С++
Написание DLL на С++
18:07

Написание dll на C++

 

Задача: написать 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

Просмотров: 1513 | Добавил: qt-boy | Теги: Написание DLL на С++ | Рейтинг: 0.0/0 |
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа
3D Облако
Мини-чат
Облако
About Qt QList Qtractor 0.4.2 QListView git-репозиторий Qt Жасмин Бланшет QtCreator 1.1 Qt Extended Qt Solutions Динамическое приведение QObject библиотеки Qt 4.5.1 Пишем собственный веб броузер QFileDialog QMessageBox Добавление информации о версии в .e Вышли бета-версии библиотеки Qt 4.7 Qt qt quick qt sdk qtcreator Singleton для Qt QInputDialog QColorDialog Примеры использования класса QEvent QFontDialog QFileSystemWatcher следим за директ GIf Анимация в QLabel Открытие ссылки в браузере установл Открытие ссылки в браузере установл Добавление итемов в QTableWidget QMap итератор Помещаем окно посередине экрана Выставляем флаги для окон Отловить нажатие клавиши на QLabel Отловить нажатие клавиши на QLabel Определить какой именно контрол был Показать на время курсор с песочным Сделать окно модальным Зашифровать данные в MD5 или MD4 Удаление из QlistWidget строки Написание DLL на С++ Диалог открытия файла Работа с реестром Ограничение на ввод определенного к QMessageBox подтверждение удаления Многопоточный сервер на примере Чат Отправляем файл на PHP скрипт Пример пересылки от клиента к серве Алгоритм сортировки (не очень оптим но если не важна скорость то сойдет Вставка текста из буфера обмена(при Проверить существует ли файл Распечатка текста из QTextEdit Вывести текст из QTextEdit в диалог Интересное о QFileInfo Отловить событие закрытие окна Проверка веб ссылки на валидность Иконка для QPushButton Преобразовать QString в char* Выдрать IP и порт из строки Получение списка всех файлов в дире Окно поверх всех Ввод пароля в QLineEdit Ввод в QLineEdit только цифр и точк Скачать файл по Ftp Пример использования оператора fore Пример использования класса QDir Получить список папок Кодирование/Декодирвоание Base64 Получить переменные среды Оставить у диалога только кнопку за Запуск сторонней программы из Qt ис Drop Добавление эффекта выделяющего прям Получение информации о свободном пр Запись структуры(пользовательского Получение информации о свободном ди Простой пример использования QProce Как унаследоваться от QObject Отрисовать виджет по форме картинки Перемещение виджета вслед за мышкой Сделать диалог поверх всех окон/поз Повернуть изображение QSignalMapper - как пользоваться Qt приведение типа QFileSystemWatcher следим за директ Добавление сигнала clicked() в QLab Рекурсивный поиск файлов и папок QWheelEvent определить направление Отловить завершение работы системы Валидация на ввод только цифр styleSheet QLabel красим текст под styleSheet QLabel простой пример styleSheet QTableWidget красим заго styleSheet QTableWidget красим QTab QTableWidgetItem текст по центу Проверка сокета Выход из вложенных циклов styleSheet QPushButton выравнивание
Наш опрос
Оцените мой сайт
Всего ответов: 91
Поиск
Календарь
«  Август 2010  »
ПнВтСрЧтПтСбВс
      1
2345678
9101112131415
16171819202122
23242526272829
3031
Архив записей
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 2
    Гостей: 2
    Пользователей: 0