在 vc++ 中,我有一个包含两个项目的解决方案。项目 A 有一个dllLoader.hand dllLoader.cpp,它加载了一个dllwith 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);}
Run Code Online (Sandbox Code Playgroud)
这是项目 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;
}
Run Code Online (Sandbox Code Playgroud)
构建项目本身没有显示任何错误并成功完成,但是当我构建解决方案(包含其他项目)时,我收到错误
C2664“HMODULE LoadLibraryA(LPCSTR)”:无法将参数 1 从“const _Elem *”转换为“LPCSTR”
您的LoadDll()函数将 astd::string作为输入,将其(错误的方式1)转换为std::wstring,然后将其传递给LoadLibrary()。但是,LoadLibrary()它不是一个真正的函数,它是一个预处理器宏,它扩展为LoadLibraryA()或LoadLibraryW()取决于您的项目是否配置为映射TCHAR到charANSI 或wchar_tUNICODE:
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
Run Code Online (Sandbox Code Playgroud)
在你的情况,那就是无法编译该项目,因为你传递一个配置为ANSI,因此编译器错误const wchar_t*到LoadLibraryA()其中一个const char*代替的预期。
最简单的解决方案是完全摆脱转换并LoadLibraryA()直接调用:
bool LoadDll(std::string FileName)
{
HMODULE dllHandle1 = LoadLibraryA(FileName.c_str());
...
}
Run Code Online (Sandbox Code Playgroud)
如果您仍想将 转换std::string为std::wstring 1,则应LoadLibraryW()直接调用:
bool LoadDll(std::string FileName)
{
std::wstring wFileName = ...;
HMODULE dllHandle1 = LoadLibraryW(wFileName.c_str());
...
}
Run Code Online (Sandbox Code Playgroud)
这样,您的代码始终与您的数据匹配,并且不依赖于任何特定的项目配置。
1:将 a 转换为 a的正确方法是使用适当的数据转换方法,例如 Win32函数、C++11 的类、第 3 方 Unicode 库等。将迭代器传递给的构造函数不执行任何转换,它只是将值按原样扩展为,因此任何> 0x7F 的非 ASCII值都不会正确转换为 Unicode(UTF-16 是 Windows 的字符串本机编码)。只有 7 位 ASCII 字符 (0x00 - 0x7F) 在 ASCII、ANSI 代码页、Unicode UTF 编码等中是相同的值。更高值的字符需要转换。std::stringstd::wstringMultiByteToWideChar()std::wstring_convertstd::stringstd::wstringcharwchar_t charwchar_t