'HMODULE LoadLibraryA(LPCSTR)':无法将参数1从'const _Elem *'转换为'LPCSTR'

时间:2018-10-26 06:39:51

标签: c++ winapi dll

在vc ++中,我有两个项目的解决方案。项目A有一个dllLoader.hdllLoader.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);}

这是项目A中的dllLoader(项目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)':无法从   'const _Elem *'到'LPCSTR'

2 个答案:

答案 0 :(得分:4)

您将宽字符串传递给该函数。因此,显然应该针对UNICODE编译代码,以便将LoadLibrary宏扩展为LoadLibraryW。但是,代码失败的项目并不针对UNICODE。因此,此处的宏扩展为LoadLibraryA。因此,由于传递了宽字符串,导致编译器错误。

因此,问题是您在不同项目中的编译器设置不一致。查看失败项目的项目配置,以确保定义了一致的条件。也就是说,请确保在包含该代码的所有项目中都定义了必需的条件(大概是为了启用UNICODE)。

答案 1 :(得分:3)

您的LoadDll()函数将std::string作为输入,将其(错误方式 1 )转换为std::wstring,然后将其传递给{{1 }}。但是,LoadLibrary()不是真正的函数,它是一个预处理器宏,它会根据您的项目配置为映射{而扩展为LoadLibrary()LoadLibraryA()从ANSI的{1}}到LoadLibraryW()或对于UNICODE的TCHAR

char

在您遇到的情况下,为ANSI配置了无法编译的项目,因此编译器错误,因为您将wchar_t传递给了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 的{​​{1}}。

最简单的解决方案是完全放弃转换并直接调用const wchar_t*

LoadLibraryA()

如果您仍然想将const char*转换为LoadLibraryA() 1 ,则应该直接调用bool LoadDll(std::string FileName) { HMODULE dllHandle1 = LoadLibraryA(FileName.c_str()); ... }

std::string

这样,您的代码将始终与您的数据匹配,并且不依赖于任何特定的项目配置。

1:将std::wstring转换为LoadLibraryW()正确方法是使用适当的数据转换方法,例如Win32 {{1} }函数,C ++ 11的bool LoadDll(std::string FileName) { std::wstring wFileName = ...; HMODULE dllHandle1 = LoadLibraryW(wFileName.c_str()); ... } 类,第三方Unicode库等。将std::string迭代器传递给std::wstring的构造函数不会执行任何转换,它只是扩展了{{ 1}}的值原样保留为MultiByteToWideChar(),因此任何 non-ASCII std::wstring_convert值> 0x7F都不会正确转换为Unicode(UTF-16是Windows的本机编码,用于std::string个字符串)。

只有7位ASCII字符(0x00-0x7F)在ASCII,ANSI代码页,Unicode UTF编码等中具有相同的值。高值字符需要转换。