Как создать dll c
Перейти к содержимому

Как создать dll c

  • автор:

Покажите, как создать DLL со строками на C++

Пробовала разные варианты создания на выходе файла DLL, который содержит несколько строк, поскольку изучаю C# — C++ непонятен совсем. Покажите пожалуйста код для создания C++ DLL, которая будет содержать пару строк (string или int), чтобы при обращении к ней, к определенному методу — возвращало ту или иную строку. Код:

File.h #include std::string String_One(); std::string String_Two(); File.cpp #include "Windows.h" #include "WowSuite.h" #include #include using namespace std; std::string String_One() < return "Hello, world!"; >std::string String_Two()

Так возможно?
Отслеживать
задан 19 окт 2016 в 5:40
681 4 4 серебряных знака 12 12 бронзовых знаков
А в чём беда _export char* getString()< return "Пара\nСтрок";>; и _export int getInt();
19 окт 2016 в 5:56

Остальное — опции компилятора. Проще всего проэкт — создать — с++ — dll библиотека (и в борланде и в студии и в многих других). В вопросе стоит указать вашу IDE или компилятор (если командной строкой создаёте) т.к в разных версиях и фирмах есть свои особенности. Возможно язык IDE (бывают русские и английские среды). Т.к. вы разработчик c# у вас MS visual studio? Английская? Какая версия 2005 или 2014?

19 окт 2016 в 5:59

для меня с++ это дремучий лес. Я не понимаю про заголовки, про создание функций, к которым я буду обращаться, все, что мне (желательно) нужно — это проект, в котором содержится метод, отображающий определенный текст(таких методов будет несколько.) После чего я хочу подключить эту библиотеку dll в c# и использовать метод, отображающий нужную мне строку

19 окт 2016 в 6:00

Для студии вот microsin.net/programming/pc/dll-building-and-using.html Если не подходит укажите какая у вас IDE.

19 окт 2016 в 6:09

Ссылка помогла создать dll файл, но я не понимаю ккак создать свой метод, который будет содержать строку, которую я хочу получить

19 окт 2016 в 6:22

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

#ifndef FILE_H #define FILE_H #if defined(MYLIBRARY) #define LIBRARY_EXPORT __declspec(dllexport) #else #define LIBRARY_EXPORT #endif #include std::string LIBRARY_EXPORT String_One(); std::string LIBRARY_EXPORT String_Two(); #endif // FILE_H 
#include "file.h" std::string String_One() < return "Hello, world!"; >std::string String_Two()

При этом в проекте сборки dll, должен присутствовать DEFINE MYLIBRARY

Для Qt-creator для этого нужно в pro-файл добавить DEFINES += MYLIBRARY

В Visual Studio в настройках проекта С/С++ -> Preprocessor -> Preprocessor Definitions просто в конце добавить MYLIBRARY.

Стоит помнить, что библиотеки, в которых используются не только встроенные типы (char, int, float, double, bool, long), а и что-то другое(в том числе и std::string) требуют использования в основной программе(откуда загружается библиотека) использования того же компилятора, в случае с visual c++ еще и требуется соблюдения версии vc10, vc12, vc14 и пр. Так как разные компиляторы могут формировать разные имена экспортируемым функциям.

Если нужно использовать функции из других языков программирования, или с другим компилятором, или с помощью динамической загрузки библиотеки и использования GetProcAddress. То в h файле должны быть только объявления с использованием встроенных типов: (char, int, float, double, bool, long) и с добавлением extern «C», например:

#ifndef FILE_H #define FILE_H #if defined(MYLIBRARY) #define LIBRARY_EXPORT __declspec(dllexport) #else #define LIBRARY_EXPORT #endif extern "C" int LIBRARY_EXPORT Val_One(); extern "C" int LIBRARY_EXPORT Val_Two(); #endif // FILE_H 
#include "file.h" int Val_One() < return 0; >int Val_Two()

Для того чтоб использовать функции в проекте c#^

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 < class Program < [DllImport("untitled.dll", EntryPoint = "Val_Two")] public static extern int func1(); static void Main(string[] args) < Console.WriteLine(func1()); Console.ReadKey(); >> > 

При этом не забыть подложить untitled.dll в папку с программой c#

Программирование на C, C# и Java

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode

Как создать dll в Visual Studio

DLL (Dynamic Link Library) — динамически подключаемая библиотека функций. Для библиотек DLL предполагается многократное использование различными программами. Поговорим о том, как создать библиотеку DLL в Visual Studio, используя языки программирования C и C#.

Создание dll на языке Си

Создаем в Visual Studio новый проект — консольное приложение.

Создаем в Visual Studio новый проект - vscode.ru

В запустившемся «Мастере приложений Win32» жмем кнопку «Далее». В следующем окне выбираем тип приложения: «Библиотека DLL»; также ставим галочку напротив параметра «Пустой проект». Жмем кнопку «Готово».

Как создать dll в Visual Studio - vscode.ru

Теперь необходимо создать два файла исходного кода: «main.cpp» и «main.def». Для этого в «обозревателе решений» нажмем правой кнопкой мыши на папку «Файлы исходного кода», далее — «Добавить» — «Создать элемент».

Создание файла исходного кода - vscode.ru

В появившемся окне «Добавление нового элемента» во вкладке «Код» представлены типы файлов, которые нам необходимы. Создадим «main.cpp» и «main.def».

Создание файлов исходного кода - vscode.ru

В итоге обозреватель решений будет выглядеть вот так:

Обозреватель решений для DLL - vscode.ru

Перейдем к файлу «main.cpp». Для примера, напишем две функции add и sub, выполняющих сложение и вычитание соответственно для двух целых чисел.

Создание библиотеки DLL на C++

В этой заметке рассказывается как создать простую DLL-библиотеку, а затем — подключить ее к своей программе. Запускаем Visual Studio и создаём проект библиотеки DLL, назовём его myDLL. Добавляем в проект новый файл myDLL.h , поместим в него следующий код:

#ifdef MYDLL_EXPORTS #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif class MyDLL < public: // Returns a + b static MYDLL_API int testSumma(int a, int b); >;

Теперь найдём в проекте файл myDLL.cpp и заменим его код следующим:
#include «stdafx.h» #include «myDll.h» #include using namespace std; int MyDLL::testSumma(int a, int b)

Библиотека из одной функции готова, но вы можете добавить туда другие функции. Попробуем использовать эту библиотеку в другом проекте. В Visual Studio создайте консольное приложение testMyDLL, снимите флажочек Precompiled header . Для использования в приложении функций, созданных в библиотеке DLL, необходимо сослаться на эту библиотеку. В свойствах проекта выберите Common Properties->References , добавьте новую ссылку на myDLL, нажав кнопку «Add New Reference…». Не забудьте прописать путь к файлу myDLL.h из предыдущего проекта библиотеки DLL. Замените кода файла testMyDLL.cpp следующим:

#include #include «myDll.h» using namespace std; int main()
Запускаем приложение testMyDLL и смотрим результат:

a = 5, b = 10 a + b = 15

06.08.2023 в 17:18 #8999
Без Visual Studio тоже можно собрать. Исходный код библиотеки ( my_dll.h ):

#ifdef MYDLL_EXPORTS #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif class MyDLL < public: // Returns a + b static MYDLL_API int testSumma(int a, int b); >;

Исходный код библиотеки ( my_dll.cpp ):
#include «my_dll.h» using namespace std; int MyDLL::testSumma(int a, int b)

Собрать библиотеку можно такой командой:
gcc -shared -o my.dll my_dll.cpp -Wl,—output-def,my_dll.def,—out-implib,my_dll.a На выходе помимо dll-файла формируется .a и .def файлы. Чтобы использовать библиотеку, копируем .dll и .h файлы в каталог проекта и собираем его так: g++ main.cpp -o main.exe -L. -lmy
Опция -lmy приводит к подключению к проекту библиотеки my.dll.

Как создать dll c

Рассмотрен по шагам процесс создания в Visual Studio файла динамически загружаемой библиотеки *.dll и методы вызова функций из неё. Все описанное далее делается на примере среды разработки Visual Studio 2003 Version 7.1.3088, но также подходит и к Visual Studio 2005. Для простоты папки создаваемых проектов будут находиться в директории C:\VSPROJ\.

[Создание библиотеки DLL]

1. File -> New -> Project, в дереве Project Types: выбираем Visual C++ Projects -> Win32, в окошке Templates: выбираем Win32 Console Project. В поле Name: вводим имя проекта для DLL, например MyDLL, в поле ввода Location: выбираем путь C:\VSPROJ (можно воспользоваться кнопкой Browse. ). Жмем ОК.

DLL-VisualStudio01.PNG

2. Появится окошко мастера настройки свойств проекта Win32 Application Wizard — MyDLL. Щелкаем на Application Settings, Application type: выбираем DLL, в Additional options: ставим галочку Empty project, жмем Finish.

DLL-VisualStudio02.PNG

3. Создадим заголовочный файл для модуля наших функций в создаваемой DLL. В дереве браузера проекта выбираем Header Files -> Add -> Add New Item. в дереве Categories: выбираем Visual C++ -> Code, в шаблонах Templates: выбираем Header File (.h). В поле Name: вводим любое имя файла, например mydllmodule, жмем Open.

DLL-VisualStudio03.PNG

Создастся новый файл, к котором предстоит ввести декларацию класса и методов функций, которые мы хотим добавить в файл DLL. Создадим класс DummyClass, и в нем две функции Beep и Msg. Одна будет выдавать короткий звуковой сигнал, вторая будет выводить окошко с сообщением. Вводим следующий текст:

namespace dllfuncs
class DummyClass
public :
// Делаем бип
static __declspec(dllexport) void ShortBeep ( void );

// Выводим окошко с сообщением
static __declspec(dllexport) void Msg ( char * msgstr);
>;
>

Вариант без использования классов:

__declspec(dllexport) void ShortBeep ( void );
__declspec(dllexport) void Msg ( char * msgstr);

4. Создадим файл для модуля наших функций в создаваемой DLL, в котором будет сам код функций. В дереве браузера проекта выбираем Source Files -> Add -> Add New Item. в дереве Categories: выбираем Visual C++ -> Code, в шаблонах Templates: выбираем C++ File (.cpp). В поле Name: вводим то же самое имя файла, которое вводили на шаге 3 — mydllmodule, жмем Open.

DLL-VisualStudio04.PNG

Создастся новый файл, к котором будет код функций, добавляемых в файл DLL. Вводим в него следующий текст:

#include «Windows.h»
#include «mydllmodule.h»

using namespace std;

namespace dllfuncs
void DummyClass::ShortBeep( void )
Beep(1000,100); //частота 1000 Гц, длительность 100 мс
>

void DummyClass::Msg( char * msgstr)
MessageBox(NULL, msgstr, «Message from DLL» , MB_OK);
>
>

Вариант без использования классов:

#include «Windows.h»
#include
#include «mydllmodule.h»

using namespace std;

void ShortBeep( void )
Beep(1000,100); //частота 1000 Гц, длительность 100 мс
>

void Msg( char * msgstr)
MessageBox(NULL, msgstr, «Message from DLL» , MB_OK);
>

После всех этих действий появится папка C:\VSPROJ\MyDLL\, в которой будут находиться файлы mydllmodule.cpp и mydllmodule.h, а также конфигурационные файлы проекта MyDLL.

5. Чтобы наш проект скомпилировался в DLL, это должно быть настроено в свойствах проекта. Проверим настройки: MyDLL -> Properties. -> Configuration Properties -> General -> Configuration Type должно быть установлено в Dynamic Library (.dll). Жмем OK.

DLL-VisualStudio05.PNG

6. Теперь скомпилируем нашу библиотеку Build -> Build MyDLL. В папке C:\VSPROJ\MyDLL\Debug появятся два файла MyDLL.dll и MyDLL.lib. Первый файл MyDLL.dll — динамически загружаемая библиотека наших функций, она должна находится в папке исполняемого файла, который использует эти функции (см. [Создание приложения, которое использует функции из DLL]). Второй файл MyDLL.lib — статическая библиотека, которая может быть присоединена на этапе компиляции к приложению, использующему функции проекта MyDLL (см. [Создание приложения, которое использует функции из статической библиотеки lib]).

[Создание приложения, которое использует функции из загружаемой DLL]

Теперь создадим простую демонстрационную программу, которая будет вызвать функции из нашей DLL.

1. File -> New -> Project, в дереве Project Types: выбираем Visual C++ Projects -> Win32, в окошке Templates: выбираем Win32 Console Project. В поле Name: вводим имя проекта для приложения, использующего загрузку DLL, например DLLtest, в поле ввода Location: выбираем путь C:\VSPROJ (можно воспользоваться кнопкой Browse. ). Также выберем радиокнопку Add to Solution, это просто добавит в нашу группу проектов (в котором уже есть проект MyDLL) новый проект DLLtest. Жмем ОК.

DLL-VisualStudio06.PNG

2. Настроим свойства тестового приложения. Выберите тип приложения Console application и нажмите Finish.

DLL-VisualStudio07.PNG

После этого автоматически создастся папка C:\VSPROJ\DLLtest\, в ней появится файл DLLtest.cpp, и туда введется пустой код тела функции _tmain. В функцию _tmain мы впоследствии добавим вызовы функций из модуля MyDLL.

3. Нужно настроить в проекте DLLtest ссылки на загружаемую DLL. Щелкаем правой кнопкой на папку DLLtest в дереве Solution Explorer — DLLtest, выберем Add Reference. откроется окно выбора внешних ссылок на загружаемые библиотеки. На закладке Projects выберите MyDLL c:\Vsproj\MyDLL\ и нажмите кнопку Select, а затем OK. В проекте DLLtest в дереве проекта появится папка References и подпапка MyDLL, в которой с помощью Object Browser можно просмотреть функции из нашей библиотеки MyDLL.

DLL-VisualStudio08.PNG

DLL-VisualStudio09.PNG

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

4. Вставим в приложение вызовы функций Msg и ShortBeep, для этого добавим в модуль DLLtest.cpp включаемый заголовок mydllmodule.h, и установим добавочные пути поиска файлов заголовков проекта DLLtest. Жмем правую кнопку на DLLtest -> выбираем Properties -> Configuration Properties -> C/C++ -> General -> Additional Include Directories -> $(ProjectDir)\..\MyDLL и жмем OK.

DLL-VisualStudio10.PNG

Добавим в модуль DLLtest.cpp вызовы функций ShortBeep и Msg, код модуля DLLtest.cpp получится следующий:

// DLLtest.cpp : здесь определена точка входа для консольного приложения.
//

#include «stdafx.h»
#include «mydllmodule.h»

using namespace std;

int _tmain( int argc, _TCHAR* argv[])

dllfuncs::DummyClass::ShortBeep();
dllfuncs::DummyClass::Msg( «Hello, world!» );
return 0;
>

Вариант без использования классов:

// DLLtest.cpp : Defines the entry point for the console application.
//

#include «stdafx.h»
#include «mydllmodule.h»

using namespace std;

int _tmain( int argc, _TCHAR* argv[])
ShortBeep();
Msg( «Hello, world!» );
return 0;
>

5. Осталось скомпилировать наше приложение (Build -> Build Solution или правой кнопкой на папку DLLtest, выбираем Build), переписать скомпилированную C:\VSPROJ\MyDLL\Debug\MyDLL.dll в папку C:\VSPROJ\DLLtest\ (иначе при старте DLLtest.exe будет выдаваться сообщение, что не найден файл библиотеки MyDLL.dll), и запустить приложение DLLtest на выполнение. Щелкаем правой кнопкой в Solution Explorer на DLLtest, выбираем в контекстном меню Set as StartUp Project. Затем выбираем Debug -> Start. Прозвучит короткий звуковой сигнал и появится окно с сообщением «Hello, world!». Отлично — наша DLL загружается и работает!

DLL-VisualStudio11.PNG

[Пути поиска библиотек DLL при запуске приложения]

При запуске приложения Windows выполняет поиск библиотек DLL в следующей последовательности:

1. Каталог, в котором находится исполняемый модуль текущего процесса.
2. Текущий каталог.
3. Системный каталог Windows (обычно это папка System32). Путь к этому каталогу извлекается с помощью функции GetSystemDirectory.
4. Каталог Windows. Путь к этому каталогу извлекается с помощью функции GetWindowsDirectory.
5. Каталоги, указанные в переменной среды PATH.

Примечание: переменная среды LIBPATH не используется.

[Ошибки в проектах с DLL]

1. fatal error LNK1104: cannot open file ‘путь_до_папки_проекта_DLL\Debug\имя_файла_библиотеки.lib’, например:

DLLtest fatal error LNK1104: cannot open file ‘\Vsproj\MyDLL\Debug\MyDLL.lib’

Такая ошибка произошла потому, что в модуле кода DLL (в нашем примере это mydllmodule.cpp) забыли подключить заголовок mydllmodule.h (по сообщению об ошибке догадаться невозможно, в чем проблема). Именно в этом заголовке используются атрибуты функций DLL (__declspec(dllexport)). Исправление ошибки: в нашем примере добавить в файл mydllmodule.cpp строчку #include «mydllmodule.h».

2. Не удалось найти компонент — «Приложению не удалось запуститься, поскольку < имя.dll >не был найден. Повторная установка приложения может исправить эту проблему.»

DLL-VisualStudio12.PNG

Проблема решается, если положить в путь поиска нужную DLL (для нашего примера файл MyDLL.dll нужно положить в папку C:\VSPROJ\DLLtest\). Самое лучшее решение — настроить команду в Post-Build Event, которая будет автоматически выполнить копирование DLL в папку отладки программы, которая использует эту DLL. Настраивается Post-Build Event просто, процесс по шагам, на нашем примере проектов MyDLL и DLLtest (предполагается, что обе папки проектов находятся на одном уровне в файловой системе, и входят в один Solution среды разработки Visual Studio, см. [3]):

1. Сначала нужно настроить порядок компиляции проектов в Solution. DLL должна компилироваться первой. Порядок компиляции настраивается через свойства Solution, контекстное меню Project Build Order.

DLL-VisualStudio13.PNG

Порядок проектов в списке можно поменять с помощью закладки Dependencies, которая определяет, какой проект от какого зависит. Первым в списке в нашем примере должен быть проект MyDLL.

2. Теперь осталось в проекте MyDLL настроить Post Build Event, копирующее результат компиляции — файл MyDLL.dll в папку Debug проекта DLLtest. Щелкаем правой кнопкой в Solution Explorer на проекте MyDLL, выбираем Properties -> Configuration Properties -> Build Events -> Post-Build Event -> вставляем в поле Command Line строку cmd /C copy /Y $(TargetPath) $(ProjectDir)\..\DLLtest\Debug\$(TargetFileName).

DLL-VisualStudio14.PNG

[Как отлаживать код DLL в Visual Studio]

В IDE есть приятная возможность отладки DLL по тексту исходного кода, однако это настраивается не слишком очевидно. Процесс по шагам (на нашем примере проектов MyDLL и DLLtest).

1. Сначала нужно задать при отладке стартовым приложением в Solution проект с DLL.

2. Нужно убедиться, что оба проекта MyDLL и DLLtest скомпилированы в конфигурации для отладки Debug.

3. Нужно настроить в свойствах проекта MyDLL запуск внешнего приложения, вызывающего нашу DLL. Щелкаем правой кнопкой в Solution Explorer на проекте MyDLL, выбираем Properties -> Configuration Properties -> Debugging -> в поле Command вводим строку $(ProjectDir)\..\DLLtest\Debug\DLLtest.exe.

Теперь можно ставить точки останова в исходном коде DLL, и отлаживать его, как обычный код. Если у Вас не работает отладка по коду DLL, то возможно, что-то не так с символами отладки (отладочной информацией). Если отладочная информация по коду DLL недоступна, то точки останова в DLL будут в виде коричневых кружков со знаками вопроса. Разобраться с проблемой загрузки символов может помочь просмотр модулей Debug -> Windows -> Modules. На скриншоте показана как раз такая проблема с отладкой.

DLL-VisualStudio15.PNG

Напротив модуля MyDLL.dll в столбце Information стоит No Symbols Loaded, что означает, что отладочная информация по коду DLL недоступна или ошибочна. Решить проблему может помочь полная рекомпиляции обоих проектов MyDLL и DLLtest, входящих в Solution. Выбираем в меню Build -> Rebuild Solution, выбираем Debug -> Start, и теперь отладка по исходному коду DLL работает.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *