在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);}
这是项目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'
答案 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
个字符串)。