Страницы

Поиск по вопросам

понедельник, 17 июня 2019 г.

Покажите, как создать 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() { return "Hello, world!"; }
Так возможно?


Ответ

file.h
#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
file.cpp
#include "file.h"
std::string String_One() { return "Hello, world!"; }
std::string String_Two() { return "Hello, world!"; }
При этом в проекте сборки 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
file.cpp
#include "file.h"
int Val_One() { return 0; }
int Val_Two() { return 1; }
Для того чтоб использовать функции в проекте 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#

Комментариев нет:

Отправить комментарий