在 Windows 上,我正在尝试使用 的变体之一LoadLibrary()
打开dll
以前写入的std::filesystem::path
带有ofstream
.
注意:我知道 dll 编写正确,因为我可以通过在运行时链接到它以标准方式使用它。
我一直在尝试结合以下两个答案中的方法。
这似乎应该是非常基本的,但是到目前为止我尝试过的任何事情我都会收到关于转换为 LPCSTR 的错误或类似的东西C2228: left of '.c_str' must have class/struct/union
让我感到困惑。
这是一个简单的例子:
// Assuming I have
// std::filesystem::path path1
// correctly set, I should be able to directly access it in
// a number of ways; i.e. path1.c_str(), path1.string.c_str(), etc.
// in order to pass it the function or a temp variable.
// However direct use of it in LoadLibrary() fails with the C2228 error.
HINSTANCE hGetProcIDDLL = LoadLibrary(path1.c_str());
我尝试避免使用宏并LoadLibraryA()
直接调用,但没有运气。我还尝试了各种传递path1
, path1.string()
, path1.string.c_str()
path1.wstring() 等的方法,但都没有成功。我还尝试以多种方式使用临时变量来避免在LoadLibrary()
.
LPCSTR temp_lpcstr = path1.c_str(); // Also tried things like path1.string() path1.string.c_str()
// Also tried just using a temp string...
std::string temp_string = path1.string(); // and variants.
我愿意尝试使用编码(如path1.u8string()
等),但我认为直接使用 of 不应该是必要的LoadLibraryA()
。
我试图避免 C 强制转换并且更喜欢 c++ static_ 或 dynamic_ 但我会使用任何有效的东西。
任何帮助表示赞赏。
提前致谢。
UPDATE
@eryk-sun 的评论和 @Gulrak 的回答为我解决了这个问题。它看起来像我的设置,但path1.c_str()
LoadLibrary wchar_t
() 宏并没有按照它应该的方式将其引导到 LoadLibraryW() 。
注意:对于将来可能偶然发现此问题的任何其他人,这里是我的特定设置的更多详细信息。我正在使用 16.1.0 (~VS2019) 的 MSVC 编译器,但它是从 VSCode 和 CMake 调用的。我没有明确定义 _UNICODE,但是 VSCode 的智能感知肯定认为它已在某处定义并指向 LoadLibraryA()。但是,我认为编译器实际上并没有看到该定义,因此它解释path1.c_str()
为wchar_t
.