Вообще говоря, существует три способа совместного программирования между VB и VC: один — создать DLL в VC и вызвать DLL в VB; второй — создать элемент управления ActiveX (.ocx) в VC и вставить его в VB; другой — создать DLL в VC. Создать сервер ActiveX Automation в VB и вызвать его в VB. Условно говоря, первый метод имеет самые низкие требования к VC-программистам, но требует сотрудничества ваших партнеров. Я рекомендую этот метод.
Давайте сначала поговорим о программировании VС++. Сначала создайте проект Win32 DLL в VС++. Добавьте в этот проект несколько функций, которые смогут вызывать пользователи VB. Чтобы функция в DLL могла быть вызвана из VB, она должна соответствовать двум условиям: первое — чтобы вызывающим методом был stdcall, а другое — чтобы она была экспортирована. Чтобы сделать первый вариант, просто добавьте ключевое слово __stdcall перед объявлением функции. нравиться:
короткий пример __stdcall (короткий nLen, короткий *buffer)
Чтобы сделать второй, вам нужно добавить в файл *.def следующие строки:
ЭКСПОРТ
образец @1
Пример: имя функции, которую вы хотите вызвать в VB, @1 представляет номер функции в DLL, и каждая функция различна. Обратите внимание, что имена функций здесь чувствительны к регистру. Что касается необходимости передачи большого объема данных, то можно сделать это, использовать массив для хранения данных в VB, а затем передать размер и адрес массива в VC (что касается того, как программировать в VB, я расскажу представим его ниже). Как и в приведенном выше примере, nLen — это размер массива, а буфер — это адрес массива. С помощью этих двух элементов вы можете обрабатывать его как массив VC. Что касается выходной графики, вы можете сгенерировать формат WMF или BMP и позволить VB вызывать его. Однако я думаю, что его также можно вывести непосредственно в окно, если VB передает дескрипторы окна hWnd и hDC и положение рисования окна (системы координат, используемые VB и VC, должны быть согласованы) в VC. Свойство AutoRedraw VB должно иметь значение False, а программа рисования VC вызывается в событии Paint.
Давайте еще раз поговорим о программировании на VB. Метод вызова DLL в VB аналогичен методу вызова Windows API, который обычно представлен в книгах по VB. В приведенном выше примере сначала объявите функцию VC:
Объявить пример библиотеки функции «mydll.dll» (ByVal nLen как целое число, буфер как целое число) как целое число
Здесь mydll.dll — это имя вашей dll. Возможно, вы заметили, что эти два параметра объявлены по-разному: к первому параметру добавлен ByVal. Правило такое: если параметр объявлен как указатель или массив в VC, ByVal не будет добавлен, в противном случае будет добавлен ByVal. Вызов этой функции в VB использует следующий синтаксис:
образец 10, а(0)
Массив a() здесь используется для хранения данных, а 10 — это длина массива. Второй параметр здесь не может быть a(), но должен быть первым из передаваемых данных. Это ключ к программированию на VB.
Ниже приведены некоторые возможные проблемы, с которыми вы можете столкнуться. Одна из проблем заключается в том, что VB может сообщить, что dll не найден. Вы можете поместить dll в системный каталог и убедиться, что оператор Declare VB верен. Другая проблема заключается в том, что VB сообщает, что не может найти нужную функцию. Обычно это происходит потому, что в VC не установлен файл *.def. Третья ситуация заключается в том, что VB сообщает, что преобразование невозможно выполнить. Это может быть связано с тем, что ключевое слово __stdcall не добавлено в VC, или это может быть связано с тем, что типы параметров VB и VC несовместимы. Обратите внимание, что int в VC равен 4. байт (эквивалент VB Long), тогда как целое число VB составляет всего 2 байта. Необходимо следить за тем, чтобы количество параметров в VB и VC было одинаковым, а также количество занимаемых ими байт тоже было одинаковым. Последнее, на что следует обратить внимание, это то, что массив не должен выходить за границы в VC, иначе это приведет к сбою программы VB.
1. Преимущества вызова DLL
Библиотека динамической компоновки (DLL), являющаяся основой операционной системы Windows, обеспечивает превосходную производительность приложений:
DLL расширяют возможности приложения. Поскольку DLL динамически загружается в адресное пространство процесса, приложение может во время выполнения определить, какие операции необходимо выполнить, а затем загрузить соответствующий код для выполнения этих операций по мере необходимости.
Библиотеки DLL могут быть написаны на разных языках. Например, VB используется для написания интерфейса прикладной программы, а C++ — для написания базовых операций, таких как алгоритмы и коммуникации.
DLL упрощают управление программными проектами. Если во время разработки программного обеспечения разные рабочие группы работают над разными модулями, проектом легче управлять.
DLL помогает экономить память. Если два или более приложений используют одну и ту же DLL, страницы DLL необходимо поместить в ОЗУ только один раз, и все приложения смогут совместно использовать отдельные страницы.
DLL облегчает совместное использование ресурсов. Библиотеки DLL могут содержать такие ресурсы, как шаблоны диалоговых окон, строки, значки и растровые изображения, и несколько приложений могут использовать библиотеки DLL для совместного использования этих ресурсов.
DLL помогает в локализации приложений. Например, приложение, которое содержит только код и не содержит компонентов пользовательского интерфейса, может загрузить библиотеку DLL, содержащую локализованные компоненты пользовательского интерфейса.
DLL помогают устранить различия между платформами. Разные версии Windows оснащены разными функциями, и разработчики часто хотят вызывать новые функции. Однако если исходный код содержит вызов новой функции, а приложение будет запускаться в версии Windows, не обеспечивающей эту функцию, загрузчик операционной системы откажется запускать процесс. Если эти новые функции сохранены в DLL, приложение может загрузить их в более старые версии Windows и успешно вызвать функцию.
2. Найдите точку входа DLL
Пользователи, впервые контактирующие с DLL, часто сталкиваются с проблемой: DLL, созданная в среде VC, прекрасно работает в VC, но при вызове в приложении VB всегда появляется запись «ошибка соглашения о вызове» или «не найден». точки» ошибки. В основном это вызвано следующими упущениями.
Прежде всего, следует отметить, что объявление функции в DLL и объявление функции в VB должны быть абсолютно одинаковыми по имени, типу возвращаемого значения, типу параметра, количеству параметров и т. д. Обратите особое внимание на вопрос капитализация.
Во-вторых, функцию записи необходимо добавить в файл .def библиотеки DLL.
Наконец, перед определением функции необходимо добавить ключевые слова extern «c» и _stdcall.
Пожалуйста, обратитесь к примеру приложения для конкретного формата.
3. Передача параметров массива в DLL
Поскольку DLL часто используется для выполнения некоторых низкоуровневых операций, приложениям часто необходимо передавать в DLL большой объем данных. В C++ указатели — лучший выбор для операций с массивами, но в VB нет понятия указателей. Обычно эту проблему можно решить двумя способами.
Во-первых, при объявлении DLL в VB используйте byref вместо byval, чтобы передать указатель массива в DLL.
Кроме того, объявив массив как вариант, вы можете напрямую передать его в DLL.
4. Примеры применения
Ниже используется конкретный пример, иллюстрирующий процесс вызова DLL, созданной в среде VC, в VB.
Создайте DLL для обработки сигналов «SigPro.dll», которая содержит функцию «Фурье» для вычислений Фурье.
Заявление в ВК:
Добавьте следующий код в «SigPro.h»,
Скопируйте код кода следующим образом:
внешний "С"
{
двойной EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos);
}
Добавьте следующий код в «SigPro.cpp»,
внешний "С"
двойной EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos)
{
интервал я;
двойной результат = 0,0;
если(SinOrCos==истина)
{
for(i=0;i<NumSam;i++)
{
результат=результат+*(Sample+i)*cos(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
еще
{
for(i=0;i<NumSam;i++)
{
результат=результат+*(Sample+i)*sin(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
результат = результат * 2/NumSam;
вернуть результат;
}
Добавьте следующий код в «SigPro.def»,
ЭКСПОРТ
Фурье
Оператор вызова в VB:
Публичное объявление функции Fourier Lib «SigPro» (ByRef Sample() как длинное, ByVal NumSam как целое число, ByVal OvertoneOrder как целое число, ByVal SinOrCos как логическое значение) как двойное значение