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

206
26 ноября 2016, 19:10

Пробовала разные варианты создания на выходе файла DLL, который содержит несколько строк, поскольку изучаю C# - C++ непонятен совсем.

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

Код:

File.h
#include <string>
std::string String_One();
std::string String_Two(); 

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

Так возможно?

Answer 1

file.h

#ifndef FILE_H
#define FILE_H
#if defined(MYLIBRARY)
    #define LIBRARY_EXPORT __declspec(dllexport)
#else
    #define LIBRARY_EXPORT
#endif
#include <string>
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#

Answer 2

Думаю что более крректно будет оставить правки тут. Пошагове руковдство создания DLL на С++ под VS тут ниже приведены правки по коду File.h

    #ifndef FILE_EXPORTS
#define  FILE_API __declspec(dllexport) 
#else
#define FILE_API __declspec(dllimport) 
#endif

#include "Windows.h"
#include "WowSuite.h"
#include <string>
#include <iostream>
namespace File 
class string_get
{
 public:    
    static std::string String_One();
    static std::string String_Two();
 } 

File.cpp

#include "stdafx.h"
#include "File.h" 
#include <stdexcept>
using namespace std;
namespace File 
          {
            string string_get::String_One()
            {
                return "Hello, world!";
            }
            string string_get::String_Two()
            {
                return "Hello, world!";
            }    
          }
READ ALSO
Подключение POCO dll C++

Подключение POCO dll C++

Пытаюсь подключить POCO-библиотекиСобрал dll проекта для работы с ZIP

235
Полный путь к файлу linux в программе С++

Полный путь к файлу linux в программе С++

Хочу написать программу, которая создаст мне файл не в папке самой программы, а в заданой мной директории линукс, например, ~/workspace/filetxt

221
Посоветуйте язык/фреймворк [закрыто]

Посоветуйте язык/фреймворк [закрыто]

Мне нужно сделать наглядно (графически) перевод из одной сс (системы счисления) в другуюНа C++ я реализовал все (в командной строке) но сказали...

149