«HMODULE LoadLibraryA (LPCSTR)»: невозможно преобразовать аргумент 1 из «const _Elem *» в «LPCSTR» - PullRequest
0 голосов
/ 26 октября 2018

в vc ++ У меня есть решение с двумя проектами.Проект A имеет dllLoader.h и dllLoader.cpp, который загружает dll с LoadLibrary, и мне нужно вызывать его функции в проекте B. Поэтому я скопировал и вставил файл заголовка и cpp в проект B.

Project A Main.cpp
------------------
#include "../Plugin/DllLoader.h"
#include "../Plugin/Types.h"
int main(){
std::string str("plugin.dll");
bool scuccessfulLoad = LoadDll(str);}

и вот dllLoader в Проекте A (зеркало / копия в Проекте B изменяются с изменениями здесь)

bool LoadDll(std::string FileName)
{
    std::wstring wFileName = std::wstring(FileName.begin(), FileName.end());
    HMODULE dllHandle1 = LoadLibrary(wFileName.c_str());
    if (dllHandle1 != NULL)
    { ****   
      return TRUE;
    }

Сборка самого проекта не показывает никаких ошибок и успешно выполнена, но когда я строю Решение (которое содержит другие проекты), я получаю сообщение об ошибке

C2664 «HMODULE LoadLibraryA (LPCSTR)»: невозможно преобразовать аргумент 1 из «const _Elem *» в «LPCSTR»

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Ваша 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 и т. Д. Символы с более высокими значениями требуют преобразования.

0 голосов
/ 26 октября 2018

Вы передаете широкую строку функции. Таким образом, код явно предназначен для компиляции для UNICODE, так что макрос LoadLibrary расширяется до LoadLibraryW. Но проект, в котором код терпит неудачу, не нацелен на UNICODE. Следовательно, макрос здесь расширяется до LoadLibraryA. И, следовательно, ошибка компилятора, потому что вы передаете широкую строку.

Следовательно, проблема в том, что у вас разные настройки компилятора в разных проектах. Проверьте конфигурацию проекта для провального проекта, чтобы убедиться, что определены согласованные условия. То есть убедитесь, что необходимые условия (предположительно для включения UNICODE) определены во всех проектах, содержащих этот код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...