Использование std::string в dll

202
15 июня 2017, 06:39

Доброго времени суток. Изучая dll, получил интересное задание - сделать библиотеку, работающую с std::string и сделать 2 exe, юзающих dll, одна из которых будет работать нормально, а другая некорректно. Корректная передача строки из dll в exe получилась довольно просто. Вот код:

dll

//dll_and_string.h
#pragma once  
#ifdef DLL_AND_STRING_EXPORTS  
#define DLL_AND_STRING_EXPORTS_API __declspec(dllexport)   
#else  
#define DLL_AND_STRING_EXPORTS_API __declspec(dllimport)   
#endif  
#include <string>
extern "C++"
{    
    DLL_AND_STRING_EXPORTS_API std::string hi();
}
// MathLibrary.cpp : Defines the exported functions for the DLL application
// Compile by using: cl /EHsc /DMATHLIBRARY_EXPORTS /LD MathLibrary.cpp  
//#include "stdafx.h"  
#include "dll_and_string.h"  
std::string hi()
{
    return "hi, baby!";
}
//dll_and_string.cpp
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

exe

//client.cpp
#include <iostream>  
#include "dll_and_string.h"  
using namespace std;
int main()
{
    cout << hi() << endl;
    return 0;
}

Как будет выглядеть кейс, при котором строка из dll прочитается некорректно? Или хотя бы в каком направлении копать?

Answer 1

Решение нашлось, выкладываю При сборке использовал разный тулсет - в моем примере это был 140 для exe и 120_xp для dll в результате передача данных через const char * проходила норм, через std::string приложение падало.

dll

//dll_and_string.h
#pragma once  
#ifdef DLL_AND_STRING_EXPORTS  
#define DLL_AND_STRING_EXPORTS_API __declspec(dllexport)   
#else  
#define DLL_AND_STRING_EXPORTS_API __declspec(dllimport)   
#endif  
#include <string>
extern "C++"
{    
    DLL_AND_STRING_EXPORTS_API std::string func1(std::string text);
    DLL_AND_STRING_EXPORTS_API const char *func2(const char *text);
}
//dll_and_string.cpp
#include "dll_and_string.h"  
std::string func1(std::string text)
{
    static std::string text_to_return = text.c_str();
    return text_to_return;
}
const char *func2(const char *text)
{
    static std::string text_to_return = text;
    return text_to_return.c_str();
}
//dll_main.cpp
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

exe

//client.cpp
#include <iostream>  
#include "dll_and_string.h"  
using namespace std;
int main()
{
    cout << func1("hello, world!") << endl;
    return 0;
}
READ ALSO
instafeed.js + scrollForever не хочет крутиться каруселька

instafeed.js + scrollForever не хочет крутиться каруселька

Скрипты instafeedjs + scrollForever подключаются в хедере сайта

355
Slider range and checkbox

Slider range and checkbox

Здравствуйте! Подскажите, пожалуйста, как можно связать динамически слайдер диапазона с чекбоксами? То есть при нажатии на определенный...

338
Многоуровневый список с checkbox

Многоуровневый список с checkbox

Здравствуйте, есть многоуровневый список с checkbox - ссылка

588
как закрыть браузер при помощи javascript или jquery?

как закрыть браузер при помощи javascript или jquery?

делаю таймер и хотелось бы, чтобы когда таймер заканчивался, закрывался браузерВозможно ли это? знаю, что можно закрыть текущую вкладку методом...

437