2015-04-30 3 views
0

Я получаю следующее сообщение об ошибке:выражение: строка итераторы incompatiable, при вызове "SetDllDirectory"

Debug Assertion Failed!

Expression: string iterators incompatible

При попытке запустить такой код:

std::string string_Dir(){return ".\\Dir\\";} 
std::wstring wstring_Dir=std::wstring(
    string_Dir().begin() 
    ,string_Dir().end() 
    ); 
SetDllDirectory(wstring_Dir.c_str()); 

Кто-то знает, почему

BTW: Я следовал this.

+0

, потому что 'string' =' wstring', потому что '' char' = wchar_t'. –

ответ

4

Вы звоните string_Dir() дважды, а затем с помощью итераторов из различныхstd::string объектов для инициализации std::wstring. Вот почему вы получаете ошибку несовместимости. Вы должны использовать итераторы из жеstd::string объекта, так называют string_Dir() один раз и назначить возвращаемое значение переменной:

std::string dir = string_Dir(); 
std::wstring wstring_Dir(dir.begin(), dir.end()); 
SetDllDirectory(wstring_Dir.c_str()); 
// or better: SetDllDirectoryW(wstring_Dir.c_str()); 

Это, как говорится, вы не превращающего из ANSI в UTF-16, так что этот код будет работать только правильно, если string_Dir() возвращает std::string, который содержит только 7bit ASCII-символы. Он не сработает, если std::string содержит любые 8-битные символы, отличные от ASCII.

Существует более простое решение - вместо этого вы можете позвонить SetDllDirectoryA(). Вам не нужен std::wstring, а операционная система может выполнять преобразование ANSI-к-UTF16 для вас:!

SetDllDirectoryA(string_Dir().c_str()); 
1

Согласно documentation, значение в вызове функции должно быть LPCTSTR вместо LPCTWSTR.

+0

Я использую UNICODE '#ifdef UNICODE #define SetDllDirectory SetDllDirectoryW' – user3405291

+0

@ user4838962" Чтобы скомпилировать приложение, использующее эту функцию, определите _WIN32_WINNT как 0x0502 или новее. " Вы тоже это сделали? –

+0

@ user4838962 Кроме того, вы бы не назвали 'SetDllDirectoryW'nstead of' SetDllDirectory' –

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