Покажите, как создать 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 новый проект — консольное приложение.

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

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

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

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

Перейдем к файлу «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. ). Жмем ОК.
2. Появится окошко мастера настройки свойств проекта Win32 Application Wizard — MyDLL. Щелкаем на Application Settings, Application type: выбираем DLL, в Additional options: ставим галочку Empty project, жмем Finish.
3. Создадим заголовочный файл для модуля наших функций в создаваемой DLL. В дереве браузера проекта выбираем Header Files -> Add -> Add New Item. в дереве Categories: выбираем Visual C++ -> Code, в шаблонах Templates: выбираем Header File (.h). В поле Name: вводим любое имя файла, например mydllmodule, жмем Open.
Создастся новый файл, к котором предстоит ввести декларацию класса и методов функций, которые мы хотим добавить в файл 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. Вводим в него следующий текст:
#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.
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. Жмем ОК.
2. Настроим свойства тестового приложения. Выберите тип приложения Console application и нажмите Finish.
После этого автоматически создастся папка 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 и инициализации указателей на используемые функции будет сгенерирован автоматически в процессе компиляции приложения.
4. Вставим в приложение вызовы функций Msg и ShortBeep, для этого добавим в модуль DLLtest.cpp включаемый заголовок mydllmodule.h, и установим добавочные пути поиска файлов заголовков проекта DLLtest. Жмем правую кнопку на DLLtest -> выбираем Properties -> Configuration Properties -> C/C++ -> General -> Additional Include Directories -> $(ProjectDir)\..\MyDLL и жмем OK.
Добавим в модуль 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 при запуске приложения]
При запуске приложения 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 (для нашего примера файл 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.
Порядок проектов в списке можно поменять с помощью закладки 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 в 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. На скриншоте показана как раз такая проблема с отладкой.
Напротив модуля MyDLL.dll в столбце Information стоит No Symbols Loaded, что означает, что отладочная информация по коду DLL недоступна или ошибочна. Решить проблему может помочь полная рекомпиляции обоих проектов MyDLL и DLLtest, входящих в Solution. Выбираем в меню Build -> Rebuild Solution, выбираем Debug -> Start, и теперь отладка по исходному коду DLL работает.