Vcl h c как подключить

от admin

Vcl h c как подключить

При открытом проекте (допустим, в нём есть модуль Unit1 и форма Form1 ) выполнить File->New->Form
Появился модуль Unit2 и форма Form2
В первом модуле ставим
#include «Unit2.h»
Или клавишами Alt+F11 (меню Files->Include Unit Hdr. )
После этого можем обращаться из первого модуля к данным второго.
Например, в Unit2.h написано:

Значит, Unit1.cpp (на его форме 1 кнопка Button1 и в коде 1 метод TForm1::Button1Click ) может быть таким:

Если мы подключили модуль без формы (меню File->New->Unit ) тогда можно делать минимум 2 способами, оба в этом примере:

Vcl.h: Нет такого файла или каталога

Я хочу скомпилировать старый код в Visual С++. Однако первая из многих ошибок, которые я получаю, заключается в следующем:

Похоже, что это относится к библиотеке Visual Component Library, родной для компиляторов Borland. Я загрузил бесплатный компилятор командной строки Borland С++ 5.5, но он, похоже, не содержит vlc.h в его каталоге include.

Как я могу решить проблему? Большое спасибо.

Этот старый код должен быть из С++ Builder. Если он фактически использует VCL, вы не сможете его создать с помощью какого-либо другого компилятора. Если есть другие VCL, такие как classes.hpp, system.hpp, controls.hpp и т.д., Он использует VCL.

Если это консольное приложение и на самом деле не использует любые классы VCL, то вы, вероятно, можете просто удалить include, но шансы на него незначительны.

Borland С++ 5.5 и С++ Builder — это два разных продукта.

Компоненты VCL находятся в продукте С++ Builder и не могут быть скомпилированы с Borland С++ 5.5, который является чистым компилятором C/С++ (я думаю, OWL включен там).

Таким образом, вы должны получить доступ к С++ Builder, чтобы скомпилировать его.

Статическое и динамическое связывание dll с приложением

Библиотеки DLL могут связываться с приложением двумя путями: статическим связыванием или динамическим связыванием.

При статическом связывании DLL загружается сразу, как только начинает выполняться приложение, которое будет ее использовать. Это наиболее простой способ использования DLL. Вызов функций в приложении при этом почти не отличается от вызова любых других функций. Здесь время загрузки увеличивается и нельзя выполнять приложение, если нет соответствующего файла DLL. Кроме того, без DLL приложение не может выполняться и в сокращенном, также рабочем варианте. Недостатком статического связывания является и то, что DLL занимает память все время, в течение которого выполняется приложение, независимо от того, вызываются ли в данном сеансе работы с приложением какие-то функции библиотеки, или нет.

Статическое связывание подразумевает, что для DLL создан специальный файл описаний импортируемых функций (import library file). Этот файл имеет расширение .lib и то же имя, что и соответствующая DLL, и должен быть связан с приложением на этапе компиляции.

При динамическом связывании DLL загружается только в тот момент, когда необходимо выполнить какую-то хранящуюся в ней функцию. Затем DLL можно выгрузить из памяти. Но при более эффективном использовании памяти вызов функций DLL существенно усложняется, и время вызова увеличивается.

Для вызова библиотечной функции надо сначала загрузить библиотеку функцией LoadLibrary API Windows. Затем с помощью функции GetProcAddress надо получить указатель на нужную функцию библиотеки. Только после этого можно выполнять функцию. А затем с помощью функции FreeLibrary надо выгрузить библиотеку из памяти.

Предположим, создана библиотека mydll.dll, содержащая некоторую функцию char* MyFunction(char*). Тогда для загрузки DLL надо выполнить оператор вида:

//загрузка DLL

HINSTANSE dllInstanse = LoadLibrary(“mydll.dll”);

Получить указатель на импортируемую функцию можно следующим кодом:

//получение указателя на функцию

typedef char* (__import FType(char*));

MyFunc = (FType*) GetProcAddress(dllInstanse, “_MyFunction”);

Объявление typedef вводит пользовательский тип (тип-функция) с произвольным именем FType. Введенный тип используется для задания типа указателя на функцию MyFunc. Для получения значения этого указателя используется функция API Windows GetProcAddress. Она принимает в качестве параметров указатель на загруженный модуль DLL и имя функции, а возвращает указатель на функцию. Этот указатель приводится к типу указателя на используемую функцию библиотеки.

Вызов функции осуществляется с помощью указателя на неё:

//вызов функции

char* S = MyFunc(“Привет!”);

Когда работа с DLL завершена, её можно выгрузить из памяти оператором вида:

//выгрузка DLL

Если нет острой необходимости использовать именно динамическое связывание, лучше всегда использовать статическое связывание.

Создание dll

Создание своей DLL начинается с выполнения команды Файл/Новый/Другое и выбором в окне Новые элементы на странице Новый пиктограммы Мастер DLL. На форме появляется окно задания опций создания DLL (рис.10.1).

Рис.10.1 — окно задания опций создания DLL

В окне выбран язык DLL – C++; индикатор Исп.VCL позволит создать DLL, которая может содержать компоненты библиотеки VCL. При этом в модуль включится файл vcl.h и установятся опции компоновки, обеспечивающие совместимость с объектами VCL. Индикатор VC++ Style DLL обеспечит создание DLL в стиле Microsoft Visual C++. После установки опций согласно рис.10.1 и щелчка на OK попадают в окно Редактора Кода с заготовкой модуля DLL. В тексте комментария заготовки рекомендуется при передаче строк в функцию и из функции использовать тип char*, а не, например, AnsiString. Приведем пример такой функции для включения в DLL.

char * Code(char * s, char Key)

for (int i = 0; ; i++)

if (s[i] == ’\0’) break;

s[i] = s[i] ^ Key;

Функция воспринимает строку типа char* и ключ типа char и возвращает зашифрованную этим ключом строку. Кодировка такова: каждый символ строки складывается с ключом по операции исключающее ИЛИ. При дешифровании достаточно с закодированной строкой выполнить ту же операцию с тем же ключом. Далее имя функции заменено на Code_Dec.

Читать:
Aa v3 exe что это за программа

Текст комментария нужно удалить.

В заготовке модуля DLL строка #include <vcl.h> подключает заголовочный файл vcl.h. Он будет нужен, если при создании DLL будут использоваться какие-то классы, формы, функции, связанные с библиотекой визуальных компонентов. Иначе – эту строку можно удалить из текста DLL.

В конце текста заготовки модуля DLL используется функция DllEntryPoint, необходимая для загрузки и выгрузки библиотеки. Она создает дескриптор hinst создаваемой DLL. Он требуется при выполнении некоторых функций, например, LoadIcon, LoadCursor и др. В этих случаях можно использовать параметр hinst для создания соответствующей глобальной переменной.

Перед описанием функции DllEntryPoint необходимо вставить директиву включения головного файла #include UMyDLL.h. Файла UMyDLL.h пока нет, — он будет создан ниже.

После выполнения последовательности очевидных действий и сохранения модуля под именем UMyDLL, а проекта – под именем MyDLL, получим файл реализации с именем UMyDLL.cpp (рис.10.2).

Рис.10.2 – файл реализации UMyDLL.cpp библиотеки

Теперь создадим заголовочный файл UMyDLL.h библиотеки. Выполним команду Файл/Новый/Другое и выберем в окне Новые элементы на странице Новый пиктограмму Файл Заголовка. Сохраним файл под именем UMyDLL.h. В появившееся окно Редактора Кода загрузим текстовый файл – запишем в файл следующий код (рис.10.3):

Рис.10.3 – заголовочный файл UMyDLL.h библиотеки

Идентификаторы _UMYDLL_H и DLL_EI могут быть любыми.

Логика работы первого фрагмента в заголовочном файле следующая: если не определен идентификатор _UMYDLL_H (ifndef _UMYDLL_H), то он определяется, т.е. замещается пустой строкой (define _UMYDLL_H ). Этот фрагмент не позволяет многократно включать заголовочный файл в файлы реализации библиотеки или приложения. Логика работы второго фрагмента в заголовочном файле следующая: если определен идентификатор __DLL__ (ifdef __DLL__), то идентификатор DLL_EI раскрывается как __declspec(dllexport); если же идентификатор __DLL__ не определен (else), то идентификатор DLL_EI раскрывается как __declspec(dllimport). C++Builder автоматически определяет __DLL__ в случае, если создается проект DLL, и не определяет этот идентификатор при создании объекта приложения. Таким образом, в зависимости от того, включается ли заголовочный файл в библиотеку или в приложение, он будет выглядеть по-разному. При компиляции библиотеки строка, определяющая функцию Code_Dec, после раскрытия макроса будет восприниматься как

extern «C» char * __declspec(dllexport) Code_Dec (char *s, char Key);

Здесь конструкция __declspec(dllexport) означает, что функция может экспортироваться из библиотеки, т.е. может вызываться внешними приложениями. Подобным же образом должны быть перечислены все функции DLL, предназначенные для прямого использования в приложениях. Помимо таких функций в DLL могут быть вспомогательные функции-утилиты, предназначенные только для использования другими функциями. Подобные утилиты не должны определяться как экспортируемые.

Когда тот же заголовочный файл включается в приложение, то эта же строка после раскрытия макроса имеет другой вид:

extern «C» char * __declspec(dllimport) Code_Dec (char *s, char Key);

Здесь конструкция __declspec(dllimport) означает, что функция импортируется, т.е. вносится в модуль приложения из DLL. Таким образом, один и тот же заголовочный файл может использоваться и при создании DLL, и в приложениях, обращающихся к данной DLL.

Продолжим создание DLL.

Выполним команду Проект/Опции и в окне опций проекта на странице Компоновщик убедимся, что включен индикатор опции Создать библиотеку импорта. Эта опция обеспечит при создании DLL автоматическую генерацию файла .lib, необходимого для статического присоединения DLL к проектам. Индикатор опции Создать библиотеку импорта будет доступен только при наличии проекта MyDLL, файлов UMyDLL.cpp и UMyDLL.h.

Выполним команду Проект/Создать MyDLL. В результате будут созданы файлы MyDLL.dll и MyDLL.lib. Убедитесь в этом.

Рис.10.4 – сообщение об ошибке

Попробуем протестировать создаваемую DLL и выполним команду Запуск/Запустить (F9). Получим сообщение об ошибке (рис.10.4), которое означает, что сначала с помощью команды Запуск/Параметры… нужно определить хост – тестирующее приложение.

vcl.h: No such file or directory

I’m looking to compile some old source code in Visual C++. However, the first of many errors I am receiving is:

This appears to be in reference to the Visual Component Library, native to Borland compilers it seems. I downloaded the free Borland C++ 5.5 command line compiler, but it doesn’t seem to contain a vlc.h in its include directory.

How can I resolve my issue? Many thanks.

Johan's user avatar

2 Answers 2

This old code must have come from C++Builder. If it actually uses the VCL, you won’t be able to build it with any other compiler. If there are other VCL includes like classes.hpp, system.hpp, controls.hpp, etc. it is using the VCL.

If it is a console application and doesn’t actually use any VCL classes, then you can probably just remove the include, but the chances are slim.

Borland C++ 5.5 and C++ Builder are two different products.

The VCL components are in the C++ Builder product and can’t be compiled with Borland C++ 5.5 which is a pure C/C++ compiler (I think OWL is included there).

So you have to get your hands on C++ Builder to be able to compile it.

    The Overflow Blog
Linked
Related
Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.3.11.43304

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Похожие статьи