2016-10-24 3 views
4

Я искал ответы на свои проблемы, но кажется, что большинство людей заинтересованы в передаче std :: string через границы .dll. Но меня больше интересует использование std :: string в классе, который находится в DLL, который я создаю.Можете ли вы использовать std :: string в сторонней DLL?

Я выпускаю мою .dll (по электронной почте) группе людей на форуме, в которой я одинок, поэтому мой вопрос: можете ли вы использовать std :: string в .dll, не имея ограничений, таких как компилятор, которые должны быть одинаковыми , версия, CRT должны быть одинаковыми и т. д.

Можете ли вы привести примеры того, что небезопасно и что безопасно?

Пример: Было ли безопасно использовать «загрузчик» для использования функции SetSender?

Mail.h

class _declspec(dllexport) Mail { 

    struct ENVELOPE { 
     std::wstring SenderEmail; //Should the type be LPWSTR or can it safely be std::wstring 
     LPWSTR SenderName; 

    }Envelope; 

public: 
    int SetSender(LPWSTR SenderEmail); 
    Mail(); 
    ~Mail(); 

}; 

Mail.cpp

#include "stdafx.h" 
#include "Mail.h" 

int CoffeeBeans::Mail::SetSender(LPWSTR Email) { 
//Pass LPWSTR instead of std::wstring across .dll boundary 

    if (Email == nullptr || lstrcmp(Email, L"") == 0) { 
     throw L"Email was either nullptr or empty."; 
    } 

    this->Envelope.SenderEmail = SenderEmail; 
    return 0; 


} 
+0

Я бы сказал, что строка C, безусловно, будет в безопасности. Так почему бы не передать C-строку только для чтения? –

+0

Я использовал .dll в прошлом, который разбил мою программу, когда я использовал функцию, которая взяла std :: string (библиотека mysqlC++), мне пришлось перекомпилировать DLL, чтобы заставить ее работать. – tkausl

+1

@PaulStelian Спасибо, но да, вы очень правы, у меня плохая привычка пропускать wchar * вместо const wchar *. –

ответ

2

Используя указатель на буфер строк, как LPWSTR или wchar_t*, и т.д. всегда будет в безопасности до тех пор, как ваш код длл не вызывая неуказанное поведение (память распределена правильно, указатель инициализирован, вы не передаете указатель на локальный буфер и т. д.). Использование std::string будет безопасным только до тех пор, пока ваша dll и хост используют ту же версию CRT. Если версии отличаются, ваши строки могут вызвать нарушения доступа на любом этапе выполнения (как правило, это происходит при уничтожении строки). Вы можете застраховать CRT-совместимость, распространяя источники данных dll или компилируя разные версии dll для всех существующих CRT (например, Oracle делает это для своей библиотеки). Такой подход не будет работать, если клиент не использует C++.

+0

Это именно то, что я испытал сегодня со сторонней DLL. Но есть ли какая-либо документация по этой проблеме MS? – Trantor

+0

@Trantor Я не видел никакой документации такого рода. – Ari0nhh

Смежные вопросы