В настоящее время я кодирую MFC DLL только с экспортируемой функцией (без класса), и обычно я использую формат

extern "C" void EXPORT_DLL function_name(parameters)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    // do something here
}

Но теперь мне нужно экспортировать массив данных. Список имен пользователей и идентификаторов (из MongoDB).

Можно ли экспортировать функцию, которая возвращает такой вектор пары, или она сломается, потому что это не экспортируемый тип?

extern "C" vector<pair<std::string, std::string>> EXPORT_DLL function_name(parameters)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    // do something here
    return a_vector_of_pair;
}

Если это невозможно, каковы другие варианты?

Спасибо.

1
user3842408 19 Авг 2014 в 19:54
А как именно вы объявляете вектор в функции extern "C"? вектор означает c ++. вы должны попробовать сделать это на c ++.
 – 
SHR
19 Авг 2014 в 20:32
Да, вот что я подумал, я попробую передать его как параметр как указатель. extern "C" void EXPORT_DLL function_name(vector<pair<std::string, std::string>>* param)
 – 
user3842408
19 Авг 2014 в 20:42
Не пропускайте вектор через границы DLL. Причина очень хорошо объясняется здесь: stackoverflow.com/questions/5661738/…
 – 
Matt
19 Авг 2014 в 21:16
Но я использую его в MFC DLL, поэтому я остаюсь в Visual Studio, C ++, в том же компиляторе. Кажется, это не относится к моей ситуации, не так ли?
 – 
user3842408
19 Авг 2014 в 21:49

1 ответ

Лучший ответ

Вы можете поставить функции без extern "C".

Это означает, что вы можете использовать эту функцию только из c ++, но не из c. (вы можете использовать другие функции extern "C" из DLL из c)

В любом случае нет использования вектора в c ...

Поместите следующий код в заголовок вашей dll:

//header
typedef std::pair<std::string,std::string> pair_strs;
typedef std::vector<pair_strs> vec_pair_strs;
vec_pair_strs DLL_EXPORT SomeFunction();

Поместите следующий код в свой источник dll:

//cpp:
vec_pair_strs DLL_EXPORT SomeFunction()
{
    vec_pair_strs v;
    //...
    return v;
}
0
SHR 19 Авг 2014 в 20:55
Обратите внимание, что если интерфейс содержит типы STL, вы можете использовать DLL только из кода, скомпилированного с той же версией компилятора, что и DLL, поскольку каждая версия компилятора имеет разные STL, несовместимые с другими.
 – 
SHR
19 Авг 2014 в 22:05