Ваша LoadDll()
функция принимает std::string
в качестве входных данных, преобразует ее (неправильный путь 1 ) в std::wstring
, а затем передает ее в LoadLibrary()
. Однако LoadLibrary()
не является реальной функцией, это макрос препроцессора , который расширяется до LoadLibraryA()
или LoadLibraryW()
в зависимости от того, настроен ли ваш проект для сопоставления TCHAR
с char
для ANSI или wchar_t
для UNICODE:
WINBASEAPI
__out_opt
HMODULE
WINAPI
LoadLibraryA(
__in LPCSTR lpLibFileName
);
WINBASEAPI
__out_opt
HMODULE
WINAPI
LoadLibraryW(
__in LPCWSTR lpLibFileName
);
#ifdef UNICODE
#define LoadLibrary LoadLibraryW
#else
#define LoadLibrary LoadLibraryA
#endif // !UNICODE
В вашей ситуации проект, который не может быть скомпилирован, настроен для ANSI, то есть ошибка компилятора, потому что вы передаете const wchar_t*
в LoadLibraryA()
, где вместо этого ожидается const char*
.
Самое простое решение - просто полностью избавиться от преобразования и вызвать LoadLibraryA()
напрямую:
bool LoadDll(std::string FileName)
{
HMODULE dllHandle1 = LoadLibraryA(FileName.c_str());
...
}
Если вы все еще хотите преобразовать std::string
в std::wstring
1 , вам следует вместо этого позвонить LoadLibraryW()
:
bool LoadDll(std::string FileName)
{
std::wstring wFileName = ...;
HMODULE dllHandle1 = LoadLibraryW(wFileName.c_str());
...
}
Таким образом, ваш код всегда соответствует вашим данным и не зависит от какой-либо конкретной конфигурации проекта.
1: правильный способ преобразования std::string
в std::wstring
заключается в использовании правильного метода преобразования данных, такого как функция Win32 MultiByteToWideChar()
, C ++ 11 std::wstring_convert
класс, сторонняя библиотека Unicode и т. Д. Передача std::string
итераторов в конструктор std::wstring
НЕ выполняет никаких преобразований, он просто расширяет значения char
как есть до wchar_t
, таким образом, любые * Значения 1048 * non-ASCII char
> 0x7F НЕ будут правильно преобразованы в Unicode (UTF-16 - родная кодировка Windows для строк wchar_t
). Только 7-битные символы ASCII (0x00 - 0x7F) являются одинаковыми значениями в ASCII, кодовых страницах ANSI, кодировках UTF в кодировке Unicode и т. Д. Символы с более высокими значениями требуют преобразования.