Доброго времени суток. Изучая dll, получил интересное задание - сделать библиотеку, работающую с std::string и сделать 2 exe, юзающих dll, одна из которых будет работать нормально, а другая некорректно. Корректная передача строки из dll в exe получилась довольно просто. Вот код:
#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;
}
#include <iostream>
#include "dll_and_string.h"
using namespace std;
int main()
{
cout << hi() << endl;
return 0;
}
Как будет выглядеть кейс, при котором строка из dll прочитается некорректно? Или хотя бы в каком направлении копать?
Решение нашлось, выкладываю При сборке использовал разный тулсет - в моем примере это был 140 для exe и 120_xp для dll в результате передача данных через const char * проходила норм, через std::string приложение падало.
#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;
}
#include <iostream>
#include "dll_and_string.h"
using namespace std;
int main()
{
cout << func1("hello, world!") << endl;
return 0;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Скрипты instafeedjs + scrollForever подключаются в хедере сайта
Здравствуйте! Подскажите, пожалуйста, как можно связать динамически слайдер диапазона с чекбоксами? То есть при нажатии на определенный...
делаю таймер и хотелось бы, чтобы когда таймер заканчивался, закрывался браузерВозможно ли это? знаю, что можно закрыть текущую вкладку методом...